我所有的 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) 我需要执行我的脚本,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 项目,以查看我的自定义 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) 我在另一个答案中读到,我无法将参数传递给解释器,而不是我给出的/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) 如果我有一个文件
#!/usr/bin/env foobar
Run Code Online (Sandbox Code Playgroud)
确定此文件是否具有 hashbang 的最快/最佳方法是什么?我听说你只能读取前 2 个字节?如何?
在 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,但这个想法被证明不受欢迎, …
有人告诉我#!/bin/bash,shell 脚本文件中的第一行 shebang ( ) 是必需的,如果没有这一行,文件将无法准确运行。但是我测试了一些脚本。没有那条线,他们工作得很好。
那行只是一条评论吗?bash 是否像其他注释一样省略了这一行?还是 bash 解释它?
那条线是强制采用那种格式吗?或者只是一个有用的可读笔记?如果我换一种方式,比如说,没有!?
我正在开发一个 perl 脚本,希望由对 shell、linux 等了解很少的 Mac 用户下载,比如说办公室经理和会计师。
下载后,只需通过 GUI 双击即可执行脚本。
我的目标是让不精通技术的用户尽可能轻松地完成这项工作。
我的疑问是:
#!/usr/bin/perl. 我应该在那里写什么?除了打开控制台并输入之外还有其他方法perl ./script.pl吗?我有一个 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) 我有一个不断增长的收集脚本这应该来源,无法运行。目前他们有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的内置命令,所以对这些脚本的替代家当线可能吗?
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