标签: shebang

在 Linux 上通过 shebang 错误地解释了 Perl 和 Python

我所有的 Python 和 Perl 脚本都不是通过 shebang 进行迭代的。绝不。但是当我显式调用二进制文件时,它们按预期工作。

我仔细检查了我的 Perl 和 Python 安装,这太奇怪了:它们在正常主机上的目标系统 chroot 中以shebang方式执行运行得非常好,但在实际运行的系统中却没有。

我在一个自制的 Linux 系统上工作,该系统在该问题出现之前运行良好。自己看:

对“xscreensaver-text”Perl 程序的测试,一次通过shebang,然后使用CLI 上的解释器:

$ LC_ALL=C LANG=C /usr/bin/xscreensaver-text
/usr/bin/xscreensaver-text: line 23: require: command not found
/usr/bin/xscreensaver-text: line 25: use: command not found
/usr/bin/xscreensaver-text: line 29: BEGIN: command not found
/usr/bin/xscreensaver-text: line 31: use: command not found
/usr/bin/xscreensaver-text: line 32: syntax error near unexpected token `('
/usr/bin/xscreensaver-text: line 32: `use POSIX qw(strftime);'

$ LC_ALL=C LANG=C perl /usr/bin/xscreensaver-text
poopy
Linux 3.11.1

Sat Oct  5 23:07:33 2013 …
Run Code Online (Sandbox Code Playgroud)

linux bash shebang interpreter

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

如何控制 bash 脚本中管道的缓冲?

我需要执行我的脚本,stdbuf -i0 -o0 -e0否则用户会想知道为什么没有输出(因为管道缓冲区)。我怎样才能实现它?

#!/usr/bin/stdbuf -i0 -o0 -e0 /bin/bash
Run Code Online (Sandbox Code Playgroud)

结果是

/usr/bin/stdbuf: invalid mode ‘0 -o0 -e0 /bin/bash’
Run Code Online (Sandbox Code Playgroud)

shell bash buffer shebang

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

编写自己的shell时应该如何处理shebang?

我正在编写一个脚本来测试一个 shell 项目,以查看我的自定义 shell 是否具有正确的输出。

str="HELLO"
echo $str
echo "*** YOU SHOULD SEE HELLO ABOVE ***"
ls *
echo "*** YOU SHOULD SEE THE OUTPUT FROM ls * ABOVE ***"
who|awk '{print $1}'
echo "*** YOU SHOULD SEE THE OUTPUT FROM who ABOVE ***"
echo $((1+2*3-4/5+6*7-8/9)))
echo "*** YOU SHOULD SEE THE NUMBER 49 ABOVE ***"
Run Code Online (Sandbox Code Playgroud)

这是脚本的输出

$ ./shell < ../tst_exp.sh 
'PATH' is set to /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin.
HELLO
*** YOU SHOULD SEE HELLO ABOVE ***
CMakeCache.txt       hello_2.7-0ubuntu1_amd64.changes  hello_2.7-0ubuntu1.diff.gz  hello_2.7.orig.tar.gz  jeff      not …
Run Code Online (Sandbox Code Playgroud)

shell-script shebang

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

在这种情况下,为什么我可以将参数传递给 /usr/bin/env?

我在另一个答案中读到,我无法将参数传递给解释器,而不是我给出的/usr/bin/env

另一个潜在的问题是该#!/usr/bin/env技巧不允许您将参数传递给解释器(除了脚本的名称,它是隐式传递的)。

但是,看起来我能够做到,因为awk当我不给它-f标志时它会损坏,而当我给它标志时它会被修复-f,同时使用/usr/bin/env

首先,没有-f标志:

$ cat wrap_in_quotes
#!/usr/bin/env awk
# wrap each line in quotes
# usage: wrap_in_quotes [ file ... ]
{ print "\""$0"\"" }
$ echo foobar | ./wrap_in_quotes
awk: syntax error at source line 1
 context is
     >>> . <<< /wrap_in_quotes
awk: bailing out at source line 1
Run Code Online (Sandbox Code Playgroud)

二、带-f旗:

$ vim wrap_in_quotes
$ cat wrap_in_quotes
#!/usr/bin/env awk -f
# …
Run Code Online (Sandbox Code Playgroud)

arguments shebang

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

确定是否存在shebang的最快方法

如果我有一个文件

#!/usr/bin/env foobar
Run Code Online (Sandbox Code Playgroud)

确定此文件是否具有 hashbang 的最快/最佳方法是什么?我听说你只能读取前 2 个字节?如何?

shell executable exec shebang

6
推荐指数
2
解决办法
1686
查看次数

检测脚本是通过 shebang 运行还是被指定为命令行参数

在 Pyenv 项目中,我们遇到了一个特殊的问题。

我们正在用我们的 Bash 脚本(“shims”)替换python(和python*),这些脚本选择要在运行时运行的 Python 可执行文件。

现在,有些用户希望使用一个特殊的选择逻辑,当一个Python脚本运行的path/to/script.py。问题是,如果脚本作为<python> path/to/script.py!

有没有办法可靠地区分这两种情况?

我找不到任何东西:根据第二种情况下命令行参数的制定方式,在两种情况下都可以执行完全相同的命令行:(
给出的 Bash 脚本不是真正的 shim,只是一个演示示例展示我们的逻辑所见和所做)

$ cat python3 
#!/bin/bash
echo "'$0'"
for a in "$@"; do
  echo "'$a'"
done
# need to do the detection here
exec python3 "$@"

$ cat t.py 
#!/home/vmuser/python3
import sys
print(sys.argv)

$ $PWD/t.py
'/home/vmuser/python3' 
'/home/vmuser/t.py'
['/home/vmuser/t.py']

$ $PWD/python3 $PWD/t.py 
'/home/vmuser/python3'
'/home/vmuser/t.py'
['/home/vmuser/t.py']
Run Code Online (Sandbox Code Playgroud)

由于shebang是Linux内核的一个特性——也许它设置了一些表明这种机制已被使用的指标?


我们曾考虑要求用户在他们希望应用特殊逻辑的 Python 脚本使用特殊的 shebang,但这个想法被证明不受欢迎, …

bash shebang

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

为什么 .sh 文件的第一行注释是必需的?

有人告诉我#!/bin/bash,shell 脚本文件中的第一行 shebang ( ) 是必需的,如果没有这一行,文件将无法准确运行。但是我测试了一些脚本。没有那条线,他们工作得很好。

那行只是一条评论吗?bash 是否像其他注释一样省略了这一行?还是 bash 解释它?

那条线是强制采用那种格式吗?或者只是一个有用的可读笔记?如果我换一种方式,比如说,没有!?

scripting bash shebang

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

运行具有未知 perl 位置的 perl 脚本

我正在开发一个 perl 脚本,希望由对 shell、linux 等了解很少的 Mac 用户下载,比如说办公室经理和会计师。

下载后,只需通过 GUI 双击即可执行脚本。

我的目标是让不精通技术的用户尽可能轻松地完成这项工作。

我的疑问是:

  • 下载后脚本将没有可执行位
  • 如果 perl 可执行文件不在默认位置,那么我应该写一些东西而不是#!/usr/bin/perl. 我应该在那里写什么?除了打开控制台并输入之外还有其他方法perl ./script.pl吗?

osx perl executable shell-script shebang

5
推荐指数
2
解决办法
778
查看次数

创建可移植地指向脚本文件夹中的解释器的shebang

我有一个 JS 文件(file.js),我想通过 nodejs(实际上是 iojs)作为命令行 shell 脚本执行;我在 Windows 上使用 MINGW Git Bash。

标准的做法是将以下shebang放在JS文件中:

#!/usr/bin/env node
Run Code Online (Sandbox Code Playgroud)

但是,我想将 cmd 行标志传递给节点以激活 V8 和声功能,即我想要一个等效的

node --harmony_arrow_functions file.js
Run Code Online (Sandbox Code Playgroud)

当运行时

./file.js
Run Code Online (Sandbox Code Playgroud)

无需手动传递标志。

使用

#!/usr/bin/env node --harmony_arrow_functions
Run Code Online (Sandbox Code Playgroud)

不起作用。

在考虑了/sf/answers/567627931//sf/answers/401498331/之后,我创建了以下解决方案:

$ ls
file.js nodeharmony.sh

$ cat nodeharmony.sh
#!/bin/sh
exec node --harmony_arrow_functions "$@"

$ cat file.js
#!/bin/sh nodeharmony.sh               # or ./nodeharmony.sh, doesn't matter
console.log("Hello world")

$ ./file.js    # this works fine
Hello world
Run Code Online (Sandbox Code Playgroud)

但问题是,当我从另一个文件夹执行它时,shell 会尝试nodeharmony.sh在当前工作目录中查找,而不是在以下目录中查找file.js

$ cd ..
$ …
Run Code Online (Sandbox Code Playgroud)

shell-script shebang

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

我可以使用 shebang 将文件源本身放入当前的 bash 环境中吗?

我有一个不断增长的收集脚本应该来源,无法运行。目前他们有shebang

#! /bin/cat
Run Code Online (Sandbox Code Playgroud)

但我更希望在运行时将它们导入到 bash 中,就像我所做的那样

$ . /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

或者

$ source /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)

但是,.source是bash的内置命令,所以对这些脚本的替代家当线可能吗?

shell bash shell-script shebang

5
推荐指数
3
解决办法
4346
查看次数

标签 统计

shebang ×10

bash ×5

shell-script ×4

shell ×3

executable ×2

arguments ×1

buffer ×1

exec ×1

interpreter ×1

linux ×1

osx ×1

perl ×1

scripting ×1