有没有一种方法可以创建脚本并使之可执行的代码少于此代码?


8

我的代码来创建可执行脚本

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh

2
@ShamFiorin我想强调甜点答案的第一部分。您应该尽量sudo少用。养成扔掉它的习惯可能很危险。在这种情况下,您拥有自己创建的脚本,因此您可以使用权限进行任何操作,而无需sudo。
玛丽

2
通常相关的信息:Bash打高尔夫球的秘诀
Digital Trauma

Answers:


18

您可以忽略整个touch命令,而无需使用sudo。为了进一步缩短命令行,您可以使用bash历史记录扩展第二次保存文件名,并省略不必要的空格:

echo "echo 'Hello World'" >script.sh&&chmod +x !#:3

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

>script.sh echo "echo 'Hello World'"&&chmod +x !#:1

请注意,有效脚本需要使用shebang

>script.sh echo -e "#!/bin/bash\necho 'Hello World'"&&chmod +x !#:1

如果您更经常需要此命令链,建议您定义一个函数,这样,您只需要键入函数名即可。同样适用的方法(虽然更长)是使用保存文件名的变量:

f=script.sh;>$f echo "echo 'Hello World'"&&chmod +x $f

如果您的文件名包含特殊字符,别忘了正确地引用它们


20

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

install /dev/stdin script.sh <<< "echo Hello World"

上面的代码使用“ here string ”在stdin上提供文本,该文本比在管道中输入的文本短一些。echo不需要引号的引数,除非它们包含具有特殊含义的字符。


请注意,herestring是一种Bashism-Heredoc是可移植的
Steven Penny

3
好主意。您还可以使用流程替代install <(echo echo Hello World) script.sh
Digital Trauma

8

我更喜欢用于cat以下任务:

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

1

您也可以忽略整个chmod,而在回显之前使用umask代替。应该为您节省几个字节。Shebang是可选的,只要您使用每个Shell(主要是bourne和C)都可以理解的命令即可。


5
您将如何精确地做到这一点?
wjandrea '18

umask默认情况下,无法用于设置可执行位...
Ravexina
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.