bash - 将 stdout 设置为默认输出文件并在 bash 中将默认值设置为 3
问题描述
我正在尝试使用标志为我的 bash 程序设置输出文件。如果我没有明确输入参数来使用标准输出,我想让它成为可能。此外,我设置了迭代次数。如果我不提供此标志,我想将其设置为 3。
这就是我所拥有的:
while getopts i:o: option
do
case "${option}"
in
i) ITERATIONS=${OPTARG};;
o) OUTPUTF=${OPTARG};;
esac
done
docker-compose up -d
for i in {1..ITERATIONS}
do docker-compose run specs | tee OUTPUTF
sleep 1
done
docker-compose stop
解决方案
默认值很简单;while
只需在循环之前分配它们。如果循环从不覆盖该值,它们将保留默认值。
棘手的部分是为OUTPUTF
. /dev/stdout
如果您的文件系统公开,或者可能,您可以使用/dev/fd/0
,但实际上并没有可以使用的标准名称。
作为替代方案,我建议将输出docker-compose
传递给一个函数,该函数的定义可能取决于该-o
选项的使用。
iterations=3
log_output () { cat; } # Meant to ignore its argument
outputf= # default value doesn't really matter
while getopts i:o: option; do
case $option in
i) iterations=$OPTARG ;;
o) log_output () { tee "$1"; }
outputf=$OPTARG
;;
esac
done
docker-compose up -d
for ((i=0; i < $iterations; i++)); do # Can't use parameters in a brace expression
docker-compose run specs
sleep 1
done | log_output "$outputf"
docker-compose stop
默认情况下,log_output
只需将其输入传递给cat
,而忽略其参数。如果使用-o
,则将log_output
重新定义为包装器tee
并保存输出文件名。无论哪种方式,log_output
都被称为 with"$outputf"
作为它的参数。
推荐阅读
- java - 我们可以在 maven 的一个命令中执行 testng (group) 和 cucumber (tag) 测试吗
- python - 如何在 matplotlib 中创建垂直垂直方向的文本?
- excel - 获取加载项引用工作簿的工作簿对象
- compiler-construction - Parsetree 中定义的常量会覆盖 Asttypes 中定义的常量吗?
- c++ - C++17:如何在并行 STL 中获取工作项的索引
- ms-access - 访问:表中的自动编译字段(不是查询)
- ruby - 在 Ruby 中使用 define_method 覆盖类的所有实例方法
- c# - 使用 UIAutomation 检索工具条按钮
- android - 如何在 Exoplayer 中仅缓存 DASH 的第一段?
- php - 如何在搜索中删除 html 标签