标签: shebang

这个以双连字符 (--) 开头的 shebang 是如何工作的?

我在 RosettaCode 页面中发现了以下类型的 shebang:

--() { :; }; exec db2 -txf "$0"
Run Code Online (Sandbox Code Playgroud)

它适用于 Db2,也适用于 Postgres。但是,我不明白整行。

我知道双破折号是 SQL 中的注释,之后它调用 Db2 可执行文件,并使用一些参数将文件本身作为文件传递。但是括号,卷曲的刹车,冒号和分号怎么样,以及如何替换真正的shebang #!?

https://rosettacode.org/wiki/Multiline_shebang#PostgreSQL

scripting shell-script sql shebang db2

17
推荐指数
2
解决办法
1210
查看次数

为什么 #!/usr/bin/env bash 在我的系统上不起作用?

我在运行一些他们抱怨的安装脚本时遇到了一些问题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-script environment-variables shebang

15
推荐指数
1
解决办法
5万
查看次数

如果 Bourne shell 在发行版中不可用,在 hashbang 中使用 /bin/sh 是否正确?

通常,shell 脚本在脚本文件的第一行包含以下注释:#!/bin/sh. 根据我的研究,这被称为“哈希爆炸”,这是常规评论。此注释通知 Unix 该文件由目录下的 Bourne Shell 执行/bin

我的问题从那一点开始。直到现在我还没有看到这样的评论#!/bin/bash。它总是#!/bin/sh。但是,Ubuntu 发行版没有 Bourne Shell 程序。他们有 Bourne Again Shell (bash)。

在这一点上,将注释#!/bin/sh放在用 Ubuntu 发行版编写的 shell 脚本中是否正确?

shell bash ubuntu shell-script shebang

15
推荐指数
4
解决办法
4675
查看次数

shell 脚本头以获得最佳兼容性

哪一个更好:

  • #!/usr/bin/env sh
  • #!/bin/sh
  • 空/无标题

我曾经认为第一个是最好的,无论如何我发现在一些基于 Linux 的系统(如 Android)上缺少路径名,所以现在我认为拥有“可移植”shell 脚本的唯一方法是不包括任何标题...

shell-script shebang

14
推荐指数
1
解决办法
7685
查看次数

为什么“ps ax”找不到正在运行的没有“#!”的 bash 脚本?头?

当我运行这个脚本时,打算一直运行直到被杀死......

# 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”本身只不过是一个评论。但是“ #!”是否具有比评论更重要的意义?

shell ps shell-script shebang

13
推荐指数
2
解决办法
3479
查看次数

分发脚本:我应该为shebang 使用/bin/gawk 还是/usr/bin/gawk?

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 怎么样?有谁知道哪个更常见或更受欢迎?

awk env shebang

12
推荐指数
3
解决办法
3139
查看次数

太多的shebang(脚本声明)行——有什么办法可以减少它们的数量?

我有一个由大约 20 个小.sh文件组成的项目。我将这些命名为“小”是因为一般来说,没有文件超过 20 行代码。我采用了模块化方法,因为这样我忠于Unix 哲学,而且对我来说维护项目更容易。

在每个.sh文件的开头,我把#!/bin/bash.

简单地说,我理解脚本声明有两个目的:

  1. 它们帮助用户回忆执行文件所需的外壳程序(例如,几年后没有使用该文件)。
  2. 它们确保脚本仅使用特定的 shell(在这种情况下为 Bash)运行,以防止在使用另一个 shell 时出现意外行为。

当一个项目开始从 5 个文件增长到 20 个文件或从 20 个文件增长到 50 个文件时(不是这种情况,只是为了演示)我们有 20 行或 50脚本声明。我承认,尽管对某些人来说可能很有趣,但使用 20 或 50 个而不是每个项目仅使用1 个(可能在项目主文件中)对我来说感觉有点多余。

有没有办法通过在某个主文件中使用一些“全局”脚本声明来避免这种所谓的 20 或 50 行或更多行的脚本声明冗余?

shell-script shebang syntax

12
推荐指数
4
解决办法
1841
查看次数

没有这样的文件或目录,但我可以看到它!

我正在尝试使用 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,我可以看到文件,所以我不知道为什么它不会运行。

ls python executable newlines shebang

11
推荐指数
1
解决办法
6万
查看次数

为什么“she-bang”以“#!”开头?

为什么“she-bang”以#!,开头#!/bin/bash?我一直接受这是如何完成的,但这背后有什么原因吗?

为什么从#;开始 这不是通常的评论吗?或者它应该是评论的重点?

shell history shebang

10
推荐指数
1
解决办法
1008
查看次数

shebang 线不适用于 cr-lf

为什么以下基本脚本的 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)

command-line newlines shebang

10
推荐指数
1
解决办法
2896
查看次数