有没有办法创建一个脚本并使它以比这更少的代码执行?

Sha*_*rin 8 command-line scripts

我创建可执行脚本的代码

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh
Run Code Online (Sandbox Code Playgroud)

del*_*tab 20

install命令(GNU的一部分的coreutils沿cpmvrm,等)可以复制一个文件,同时还设置了所有权和权限以及创建父目录是必要的。默认情况下,它将使新文件可执行。它不理解 ' -' 但/dev/stdin可以改用:

install /dev/stdin script.sh <<< "echo Hello World"
Run Code Online (Sandbox Code Playgroud)

上面使用' here string ' 来提供stdin 上的文本,这比管道输入要短一些。参数echo不需要引用,除非它们包含具有特殊含义的字符。

  • 好主意。您还可以使用 [进程替换](https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html):`install &lt;(echo echo Hello World) script.sh` (3认同)

des*_*ert 18

您可以省略整个touch命令,而无需使用sudo. 要进一步缩短命令行,您可以使用bashHistory Expansion第二次保存文件名,并省略不必要的空格:

echo "echo 'Hello World'" >script.sh&&chmod +x !#:3
Run Code Online (Sandbox Code Playgroud)

History Expansion 替换!#:3为当前命令行中的第四个单词,在您的情况下是 filename script.sh。当然,如果您修改第一个命令,则需要对此进行调整,例如:

>script.sh echo "echo 'Hello World'"&&chmod +x !#:1
Run Code Online (Sandbox Code Playgroud)

请注意,有效的脚本需要shebang

>script.sh echo -e "#!/bin/bash\necho 'Hello World'"&&chmod +x !#:1
Run Code Online (Sandbox Code Playgroud)

如果您更频繁地需要此命令链,我建议您定义一个函数,这样您只需要键入函数名称。一种类似的适应性 - 虽然更长 - 方式是使用保存文件名的变量:

f=script.sh;>$f echo "echo 'Hello World'"&&chmod +x $f
Run Code Online (Sandbox Code Playgroud)

如果您的文件名包含特殊字符,请不要忘记正确引用它们


ste*_*ver 8

我更喜欢cat用于这样的任务:

cat > script.sh && chmod +x script.sh
#!/bin/sh
echo 'Hello World'Enter
Ctrl+D