首页 > 解决方案 > 将 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

标签: bashdocker

解决方案


默认值很简单;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"作为它的参数。


推荐阅读