stdin 到 while 循环的不明确重定向

stdin 到 while 循环的不明确重定向

我想为文件列中的每个条目运行命令。我目前正在执行以下操作,但收到不明确的重定向错误。

while read -r entry;
do
  cmd "$entry" ;
done < $(cut -f2 file.tsv)

我也尝试过

done <(cut -f2 file.tsv)

这会引发意外的令牌语法错误。

执行此操作的正确语法是什么?


输入示例

制表符分隔值文件以及感兴趣列中的文件路径。

1    file1.txt    ...
2    file2.txt    ...
3    file3.txt    ...

预期结果

该脚本应该运行命令

cmd file1.txt
cmd file2.txt
cmd file3.txt

出于简单示例的目的,您可以使用catas cmd,因为错误不在于cmd 本身,但带有输入重定向。

我运行的实际命令是生物信息学工具卡利斯托, 具体来说kallisto quant

答案1

看起来这是正确的方法:

while read -r entry;
do
  cmd "$entry" ;
done < <(cut -f2 file.tsv)

根据这个 bash 重定向备忘单,此语法将 的输出传递cut -f2 file.tsv给匿名 fifo,然后将其传递给 stdin。

答案2

您的代码可以修改如下:

cut -f2  file.tsv | while read -a entry;
do
  cmd "$entry" ;

done

请注意,每当您运行 shell 脚本时,它都会创建一个名为 subshel​​l 的新进程,并且您的脚本将使用 subshel​​l 执行。但是,可以使用 Subshel​​l 进行并行处理。如果您在当前 shell 之上启动另一个 shell,则它可以称为子 shell。键入以下命令以查看子 shell 值:

echo $BASH_SUBSHELL

或者

echo "Current shell: $BASH_SUBSHELL"; ( echo "Running du in subshell: $BASH_SUBSHELL" ;cd /tmp; du 2>/tmp/error 1>/tmp/output)

括号内的任何命令都在子 shell 中运行。

相关内容