我有一个 shell 脚本,我想在其中添加一个 shebang。给定一个定义如下的变量:
SHEBANG="#!/bin/sh"
Run Code Online (Sandbox Code Playgroud)
我的问题是我是否可以在另一个脚本中使用该变量,如下所示:
$SHEBANG
# other stuff...
Run Code Online (Sandbox Code Playgroud) 我最近注意到许多脚本/usr/bin/env在他们的shebang中使用。我已经看到主要使用Bash和Python,但迄今为止从未与POSIX sh ( ash, dash,... )结合使用。
我想知道为什么,如果我的本意是高度可移植的POSIX shell 脚本可能会从这种env方法中受益?
关于是否使用:是否存在普遍共识:
标准:
#!/bin/sh
Run Code Online (Sandbox Code Playgroud)环境:
#!/usr/bin/env sh
Run Code Online (Sandbox Code Playgroud)让我足够强调这一点:
我从来没有见过这个sh。
我在kali linux 64位上。
我创建了一个 python 脚本,它需要 2 个参数来启动。我不想每次都输入完全相同的路径或搜索我在终端中使用的命令的历史记录。所以我决定创建一个简单的脚本,用它的参数调用 python 脚本。
#! /bin bash
python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/
Run Code Online (Sandbox Code Playgroud)
这与我在终端中使用的命令完全相同。但是,当我尝试执行脚本文件时收到错误消息。
bash: ./wtf.sh: /bin: bad interpreter: Permission denied
Run Code Online (Sandbox Code Playgroud)
wtf.sh 具有可执行权限。
怎么了?
我有一个名为 test.sh 的文件:
#!/bin/bash -o pipefail
echo "Running test"
git diff HEAD^ HEAD -M --summary |
grep delete |
cut --delimiter=' ' -f 5
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此脚本时:
./test.sh
Run Code Online (Sandbox Code Playgroud)
我得到:
/bin/bash: line 0: /bin/bash: ./test: invalid option name
Run Code Online (Sandbox Code Playgroud)
我跑去cat -v test.sh查看有没有回车什么的,但是好像没有。如果我只是将其作为 运行,我就可以运行该脚本bash test.sh。感谢您的帮助,如果我能提供更多信息,请告诉我!
我有一个sed在 Linux 上使用的 GNU脚本;它安装在/bin/sed,似乎包含 GNUisms。我有使用 Mac OS X 的合作者。他们已经安装了(非 GNU)sed,位于/usr/bin/sed,并且使用 Homebrew(http://mxcl.github.io/homebrew/)可以sed像gsed使用位于的coreutils包一样安装 GNU /usr/local/bin/gsed。
目前,脚本以#!/bin/sed -f. 当 GNUsed安装为时,如何修改它以便它可以在 Mac OS X 上运行gsed?
另一种选择是删除 GNUisms,但这可能有点困难,因为我手头没有 Mac OS X 安装并且不能要求我的合作者测试中间版本。
我有一个来自其他人的脚本,可以查看(注意:它是一个文件):
#!/bin/bash
some commands
some commands
#!/bin/bash
some commands
some commands
#!/bin/bash
some commands
some commands
Run Code Online (Sandbox Code Playgroud)
我想知道第二次和第三次shebangs的目的是什么?是误会还是故意的?
我有一个包含以下内容的脚本:
#!/bin/bash
printenv
Run Code Online (Sandbox Code Playgroud)
当我从命令行运行它时:
env testscript.sh
bash testscript.sh
sh testscript.sh
Run Code Online (Sandbox Code Playgroud)
每次,它输出SHELL=/bin/bash. 但是,当它从 cron 运行时,它总是输出SHELL=/bin/sh. 为什么是这样?我怎样才能让cron应用shebang?
我已经检查了 cron PATH;它确实包括/bin。
我已经下载了这个名为 pyAES.py 的脚本,并将它放在我的 Linux 桌面目录中的文件夹名称代码中,
根据这个例子, http://brandon.sternefamily.net/2007/06/aes-tutorial-python-implementation/
当我打字时,
./pyAES.py -e testfile.txt -o testfile_encrypted.txt
Run Code Online (Sandbox Code Playgroud)
应该执行文件 pyAES.py。但我收到此错误,
pi@raspberrypi ~/Desktop/Codes $ pyAES.py
-bash: pyAES.py: command not found
Run Code Online (Sandbox Code Playgroud)
ls -l命令的输出是,
pi@raspberrypi ~/Desktop/Codes $ ls -l
total 16
-rw-r--r-- 1 pi pi 14536 Oct 8 10:44 pyAES.py
Run Code Online (Sandbox Code Playgroud)
这是之后的输出 chmod +x
pi@raspberrypi ~/Desktop/Codes $ chmod +x pyAES.py pi@raspberrypi ~/Desktop/Codes $
pi@raspberrypi ~/Desktop/Codes $ pyAES.py
-bash: pyAES.py: command not found
pi@raspberrypi ~/Desktop/Codes $
Run Code Online (Sandbox Code Playgroud)
和命令,chmod +x pyAES.py && ./pyAES.py给出以下错误,
-bash: ./pyAES.py: /usr/bin/python2: bad interpreter: No …Run Code Online (Sandbox Code Playgroud) 假设我有一个文件hello:
#!/bin/sh
echo "Hello World!"
Run Code Online (Sandbox Code Playgroud)
如果在该文件上设置了可执行位,我可以通过在提示中输入其路径来执行它:
$ ./hello
Hello World!
Run Code Online (Sandbox Code Playgroud)
是否有更明确的等价于上述内容?类似于:
$ execute hello
Run Code Online (Sandbox Code Playgroud)
我知道我可以将hello作为参数传递给/bin/sh,但我正在寻找一种解决方案,该解决方案可以自动使用 shebang 行中指定的解释器
我的用例是执行没有设置可执行标志的脚本文件。这些文件存储在 git 存储库中,因此我想避免设置它们的可执行标志或必须先将它们复制到另一个位置。
我注意到对于bash脚本,有些人使用了与我习惯放在自己顶部的不同的
shebang。
有人可以简化这两者之间的区别吗?我一直用那个#!/bin/bash。
#!/bin/bash
#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud) shebang ×10
shell-script ×6
bash ×5
executable ×4
shell ×4
cron ×1
kali-linux ×1
linux ×1
path ×1
portability ×1
posix ×1
python ×1
scripting ×1
sed ×1