我在 RosettaCode 页面中发现了以下类型的 shebang:
--() { :; }; exec db2 -txf "$0"
Run Code Online (Sandbox Code Playgroud)
它适用于 Db2,也适用于 Postgres。但是,我不明白整行。
我知道双破折号是 SQL 中的注释,之后它调用 Db2 可执行文件,并使用一些参数将文件本身作为文件传递。但是括号,卷曲的刹车,冒号和分号怎么样,以及如何替换真正的shebang #!?
我在运行一些他们抱怨的安装脚本时遇到了一些问题bad interpreter。
所以我做了一个简单的例子,但我无法弄清楚问题是什么,见下文。
#!/usr/bin/env bash
echo "hello"
Run Code Online (Sandbox Code Playgroud)
执行上面的脚本会出现以下错误
[root@ech-10-24-130-154 dc-user]# ./junk.sh
bash: ./junk.sh: /usr/bin/env: bad interpreter: No such file or directory
Run Code Online (Sandbox Code Playgroud)
该/usr/bin/env文件存在,见下图:
[root@ech-10-24-130-154 dc-user]# ls -l /usr/bin/env
lrwxrwxrwx 1 root root 13 Jan 27 04:14 /usr/bin/env -> ../../bin/env
[root@ech-10-24-130-154 dc-user]# ls -l /bin/env
-rwxr-xr-x 1 root root 23832 Jul 16 2014 /bin/env
[root@ech-10-24-130-154 dc-user]#
Run Code Online (Sandbox Code Playgroud)
如果我更改脚本以使用常规的shebang,#!/bin/bash它就没有问题。#!/bin/env bash也有效。
允许便携式shebang工作的环境中缺少什么?
ls -lL /usr/bin/env返回ls: cannot access /usr/bin/env: No such file or directory所以我想我需要更改符号链接?我可以指点一下/bin/env …
通常,shell 脚本在脚本文件的第一行包含以下注释:#!/bin/sh. 根据我的研究,这被称为“哈希爆炸”,这是常规评论。此注释通知 Unix 该文件由目录下的 Bourne Shell 执行/bin。
我的问题从那一点开始。直到现在我还没有看到这样的评论#!/bin/bash。它总是#!/bin/sh。但是,Ubuntu 发行版没有 Bourne Shell 程序。他们有 Bourne Again Shell (bash)。
在这一点上,将注释#!/bin/sh放在用 Ubuntu 发行版编写的 shell 脚本中是否正确?
哪一个更好:
#!/usr/bin/env sh#!/bin/sh我曾经认为第一个是最好的,无论如何我发现在一些基于 Linux 的系统(如 Android)上缺少路径名,所以现在我认为拥有“可移植”shell 脚本的唯一方法是不包括任何标题...
当我运行这个脚本时,打算一直运行直到被杀死......
# foo.sh
while true; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
...我无法找到它使用ps ax:
>./foo.sh
// In a separate shell:
>ps ax | grep foo.sh
21110 pts/3 S+ 0:00 grep --color=auto foo.sh
Run Code Online (Sandbox Code Playgroud)
...但如果我只是将常见的“ #!”头添加到脚本中...
#! /usr/bin/bash
# foo.sh
while true; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)
...然后脚本可以通过相同的ps命令找到...
>./foo.sh
// In a separate shell:
>ps ax | grep foo.sh
21319 pts/43 S+ 0:00 /usr/bin/bash ./foo.sh
21324 pts/3 S+ 0:00 grep --color=auto foo.sh
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
这可能是一个相关的问题:我认为“ #”只是一个评论前缀,如果是这样,“ #! /usr/bin/bash”本身只不过是一个评论。但是“ #!”是否具有比评论更重要的意义?
gawk 通常是在 /bin 还是 /usr/bin 中?我会去,#!/usr/bin/env gawk但后来我不能使用参数。现在我正在使用#!/bin/gawk -f. 脚本很长,包含很多单引号,并与标准输入一起使用。
GNU Awk 手册有部分 1.1.4 Executable awk Programs在它的示例中使用 #!/bin/awk 但接着说:
请注意,在许多系统上
awk可能会发现 in/usr/bin而不是 in/bin。买者自负。
大多数人做什么?我读过sed 应该在 /bin 中标准化,而 perl 应该在 /usr/bin 中标准化(与 sed 链接相同的页面,但他们不会让我为这篇文章制作第三个链接)。awk/gawk 怎么样?有谁知道哪个更常见或更受欢迎?
我有一个由大约 20 个小.sh文件组成的项目。我将这些命名为“小”是因为一般来说,没有文件超过 20 行代码。我采用了模块化方法,因为这样我忠于Unix 哲学,而且对我来说维护项目更容易。
在每个.sh文件的开头,我把#!/bin/bash.
简单地说,我理解脚本声明有两个目的:
当一个项目开始从 5 个文件增长到 20 个文件或从 20 个文件增长到 50 个文件时(不是这种情况,只是为了演示)我们有 20 行或 50行脚本声明。我承认,尽管对某些人来说可能很有趣,但使用 20 或 50 个而不是每个项目仅使用1 个(可能在项目的主文件中)对我来说感觉有点多余。
有没有办法通过在某个主文件中使用一些“全局”脚本声明来避免这种所谓的 20 或 50 行或更多行的脚本声明冗余?
我正在尝试使用 winSCP 在无头 Raspberry PI 上运行 python 脚本并收到以下错误消息:
Command '"./areadetect_movie_21.py"'
failed with return code 127 and error message
/usr/bin/env: python
: No such file or directory.
Run Code Online (Sandbox Code Playgroud)
当我尝试从终端运行时,我得到:
: No such file or directory.
Run Code Online (Sandbox Code Playgroud)
我在同一个目录中尝试了一个类似的 python 脚本,使用相同的 python shebang、相同的权限并使用相同的用户 pi,它可以工作。
我也做了一个ls,我可以看到文件,所以我不知道为什么它不会运行。
为什么“she-bang”以#!,开头#!/bin/bash?我一直接受这是如何完成的,但这背后有什么原因吗?
为什么从#;开始 这不是通常的评论吗?或者它应该是评论的重点?
为什么以下基本脚本的 shebang 部分不起作用:
$ cat hello.sh
#! /bin/sh
echo Hello
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory
$ cat hello.py
#! /usr/bin/env python3
print("Hello")
$ ./hello.py
: No such file or directory
Run Code Online (Sandbox Code Playgroud)
而手动调用解释器正在工作:
$ sh hello.sh
Hello
$ python3 hello.py
Hello
Run Code Online (Sandbox Code Playgroud)