我遇到了以下代码段:
sh -c 'some shell code' sh …
Run Code Online (Sandbox Code Playgroud)
(其中…表示零个或多个附加参数)。
我知道第一个sh是命令。我知道sh -c应该执行提供的 shell 代码(即some shell code)。第二个目的是sh什么?
类似或相关的问题有时会sh -c在答案中正确使用后作为后续问题出现,并且提问者(或其他用户)想详细了解答案的工作原理。或者它可能是“这段代码做什么?”类型的更大问题的一部分。当前问题的目的是在下面提供规范的答案。
这里涵盖的主要问题、类似或相关问题是:
sh在sh -c 'some shell code' sh …?bash在bash -c 'some shell code' bash …?find-sh在find . -exec sh -c 'some shell code' find-sh {} \;?some shell code在一个 shell 脚本中并且我们调用了./myscript foo …,那么 …我想限制 find 命令的输出。过去我曾经用于这个 ls 命令,例如:
ls *tgz|head -100|xargs -i mv "{}" ../
Run Code Online (Sandbox Code Playgroud)
但我知道如果文件名包含换行符,结果可能是不可预测的。所以更正确的方法是这样的:
find ... -print0 | xargs -0
Run Code Online (Sandbox Code Playgroud)
但是采用这种方法我无法使用 head 命令限制 find 的输出 - 它显示所有文件名用 ^@ 特殊符号分隔:
find . -name '*tgz' -print0|head -2|less
Run Code Online (Sandbox Code Playgroud)
file1.tgz^@file2.tgz^@file3.tgz^@file4.tgz^@file5.tgz^@
有没有办法消除这种尴尬?
我试图在 awk 的帮助下解决它:
find . -name 'BATCHED*' -print0|awk 'BEGIN{RS=""}'
Run Code Online (Sandbox Code Playgroud)
但它仍然显示所有或零行。
可以借助awk解决吗?有更好的解决方案吗?
顺便提一句。我发现这个非常有指导意义的参考,但我的问题没有答案。
跑步:
$find . -name *.exe
Run Code Online (Sandbox Code Playgroud)
给出:
./MakeItSo_1.2.2/MakeItSo_1.2.2/MakeItSo.exe
./MakeItSo.exe
Run Code Online (Sandbox Code Playgroud)
但这些并不是目录中唯一的 exe 文件。例如,运行
$find . -name ATLTester.exe
Run Code Online (Sandbox Code Playgroud)
给出:
./Debug/ATLDmoVexaTester.exe
Run Code Online (Sandbox Code Playgroud)