使用管道,可以使用简单的 shell 内置命令创建文件。
{ echo "#!/bin/bash" \
echo "echo Hello, World!" \
} > helloworld.sh
有了chmod
这些就可以使其可执行。
$ chmod 755 helloworld.sh
$ ./helloworld.sh
Hello, World!
我想知道是否可以保存该chmod
步骤。我已经发现了umask
无法完成这项工作。但也许有人知道环境变量、bash 技巧、管道程序或其他巧妙的方法来做到这一点。
是否可以在已设置可执行位的情况下创建文件?
答案1
仅使用 shell 重定向操作符不可能创建可执行文件。没有可移植的方式,bash 中也没有方式(在源代码中,可以看到重定向调用do_redirection_internal
哪个来电 redir_open
参数mode
设置为0666,依次调用open
该模式)。
无论如何,您都会调用 shell 命令,因此请; chmod +x …
在其中添加某个位置。这绝对没有什么问题。多一行代码不是问题。您需要做三件事(创建一个包含给定内容的文件,使文件可执行,执行它),所以写三行。
有一个相对晦涩的shell命令可以创建一个具有某些指定内容的可执行文件:uudecode
。但我不建议使用它:它要求输入以不可读的格式传递,它绕过用户的 umask,而且它很晦涩。
如果您知道使用哪个解释器来执行该文件,一个明智的选择是调用bash /the/script
而不是。chmod +x /the/script && chmod +x
答案2
从管道输入创建可执行 shell 脚本的函数:
pipe2script() { touch "$1" ; chmod +x "$1" ; \
echo '#!'"$(which ${2:-bash})" > "$1" ; cat >> "$1" ; }
用于pipe2script
将两行文本通过管道传输到foo.sh
:
printf 'echo hello world\necho bye\n' | pipe2script foo.sh
这会输出一个新的可执行文件foo.sh
:
$ ls -log foo.sh
-rwxrwxr-x 1 38 Mar 18 09:05 foo.sh
跑步cat foo.sh
节目:
#!/bin/bash
echo hello world
echo bye
运行:
./foo.sh
输出:
hello world
bye
该pipe2script
函数默认使用 using bash
,但它可以采用任何其他 shell 名称的第二个参数,即dash
、zsh
、ksh93
、等。使用shell 命令的python
示例:fish
math
printf 'math "99^33"\n' | pipe2script foo.fish fish
跑步cat foo.fish
节目:
#!/usr/bin/fish
math "99^33"
输出./foo.fish
:
717730532598275105894510914059816191752829524684539601273450723299
编辑脚本的副本:
sed '2,${s/.*/echo & | jethro/e;s/ / "/;s/$/"/}' foo.sh | pipe2script foojc.sh
运行时输出:
$ ./foojc.sh
howdy world
y'all come back now, heah?