我想为文件列中的每个条目运行命令。我目前正在执行以下操作,但收到不明确的重定向错误。
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
出于简单示例的目的,您可以使用cat
as 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 脚本时,它都会创建一个名为 subshell 的新进程,并且您的脚本将使用 subshell 执行。但是,可以使用 Subshell 进行并行处理。如果您在当前 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 中运行。