通过管道创建可执行文件

通过管道创建可执行文件

使用管道,可以使用简单的 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 名称的第二个参数,即dashzshksh93、等。使用shell 命令的python示例:fishmath

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?

相关内容