我编写了以下脚本来比较两个目录的输出,其中包含所有相同的文件:
#!/bin/bash
for file in `find . -name "*.csv"`
do
echo "file = $file";
diff $file /some/other/path/$file;
read char;
done
Run Code Online (Sandbox Code Playgroud)
我知道还有其他方法可以实现这一目标。奇怪的是,当文件中有空格时,这个脚本会失败。我该如何处理?
find 的示例输出:
./zQuery - abc - Do Not Prompt for Date.csv
Run Code Online (Sandbox Code Playgroud) 似乎通常的做法会将 IFS 的设置放在 while 循环之外,以免在每次迭代时重复设置......这只是一种习惯性的“猴子看,猴子做”的风格,就像这只猴子直到我读过man read,还是我在这里错过了一些微妙(或明显明显)的陷阱?
我知道您可以创建一个文件描述符并将输出重定向到它。例如
exec 3<> /tmp/foo # open fd 3.
echo a >&3 # write to it
exec 3>&- # close fd 3.
Run Code Online (Sandbox Code Playgroud)
但是你可以在没有文件描述符的情况下做同样的事情:
FILE=/tmp/foo
echo a > "$FILE"
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个很好的例子,说明何时必须使用额外的文件描述符。
我有一个包含命令的多行输出的变量。从变量中逐行读取输出的最有效方法是什么?
例如:
jobs="$(jobs)"
if [ "$jobs" ]; then
# read lines from $jobs
fi
Run Code Online (Sandbox Code Playgroud) 我很难理解如何在 shell 脚本中使用文件描述符。
我知道基础知识,例如
exec 5 > /tmp/foo
Run Code Online (Sandbox Code Playgroud)
所以 fd 5 附加到 foo 用于写入。
exec 6 < /tmp/bar
Run Code Online (Sandbox Code Playgroud)
……阅读。
exec 5>&-
Run Code Online (Sandbox Code Playgroud)
...关闭fd。
这有什么作用呢?
#!/bin/bash
exec 5 > /tmp/foo
exec 6 < /tmp/bar
cat <&6 | while read a
do
echo $a >&5
done
Run Code Online (Sandbox Code Playgroud)
据我所知,&5
关闭了 fd,那么每次调用后输出仍然如何成功重定向?
这是复制意大利面来自:这里
它声称在简单的echo $a > file
情况下使用它会使其更快,但我无法理解。我将不胜感激任何指向体面教程的链接。我的谷歌权力似乎让我失望。