我听说printf比echo. 根据我的经验,我只能回忆起一个我不得不使用的实例,printf因为它echo无法将一些文本输入到 RHEL 5.8 上的某个程序中,但printf确实如此。但显然,还有其他差异,我想询问它们是什么以及是否有特定情况下何时使用一种与另一种。
在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?
正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念、可靠性、易读性、性能和安全性。
这个答案解释了可靠性和易读性方面:
while IFS= read -r line <&3; do
printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)
为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置的read shell一次读取一个字符。
怎么样的概念和安全性方面?
如果我调用某个命令,例如,echo我可以在其他几个命令中使用该命令的结果tee。例子:
echo "Hello world!" | tee >(command1) >(command2) >(command3)
Run Code Online (Sandbox Code Playgroud)
使用 cat 我可以收集几个命令的结果。例子:
cat <(command1) <(command2) <(command3)
Run Code Online (Sandbox Code Playgroud)
我希望能够同时做这两件事,这样我就可以tee在其他东西的输出上调用这些命令(例如echo我写的),然后在一个输出上收集所有结果cat.
保持结果为了这一点很重要,这意味着输出的线路command1,command2并且command3不应该纠缠在一起,但订购的命令是(因为它与发生cat)。
可能有比cat和更好的选择,tee但这些是我目前所知道的。
我想避免使用临时文件,因为输入和输出的大小可能很大。
我怎么能这样做?
PD:另一个问题是这种情况发生在循环中,这使得处理临时文件变得更加困难。这是我拥有的当前代码,它适用于小型测试用例,但是在以某种我不理解的方式从 auxfile 读取和写入时,它会创建无限循环。
somefunction()
{
if [ $1 -eq 1 ]
then
echo "Hello world!"
else
somefunction $(( $1 - 1 )) > auxfile
cat <(command1 < auxfile) \
<(command2 < auxfile) \
<(command3 < auxfile)
fi …Run Code Online (Sandbox Code Playgroud) 我知道如何组合不同命令的结果
paste -t',' <(commanda) <(commandb)
Run Code Online (Sandbox Code Playgroud)
我知道将相同的输入管道传输到不同的命令
cat myfile | tee >(commanda) >(commandb)
Run Code Online (Sandbox Code Playgroud)
现在如何组合这些命令?这样我才能做到
cat myfile | tee >(commanda) >(commandb) | paste -t',' resulta resultb
Run Code Online (Sandbox Code Playgroud)
说我有一个文件
我的文件:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
我想新建一个文件
1 4 2
2 3 4
3 2 6
4 1 8
Run Code Online (Sandbox Code Playgroud)
我用了
cat myfile | tee >(tac) >(awk '{print $1*2}') | paste
Run Code Online (Sandbox Code Playgroud)
会给我垂直的结果,我真的想以水平顺序粘贴它们。