我想在分离的屏幕中运行 bash 脚本。该脚本多次调用程序,每次都需要等待太长时间。我的第一个想法是简单地打开一个屏幕,然后调用脚本,但似乎ctrl-a d在脚本运行时我无法分离 (by )。所以我做了一些研究,发现这个指令用以下内容替换了shebang:
#!/usr/bin/screen -d -m -S screenName /bin/bash
Run Code Online (Sandbox Code Playgroud)
但这也不起作用(无法识别选项)。有什么建议?
PS 我刚刚想到screen -dmS name ./script.sh这可能对我的目的有用,但我仍然很好奇如何将它合并到脚本中。谢谢你。
我可以假设已经zsh安装了足够多的人来运行带有
#!/usr/bin/env zsh
Run Code Online (Sandbox Code Playgroud)
作为舍邦?
或者这会使我的脚本无法在太多系统上运行吗?
澄清:我对最终用户可能想要运行的程序/脚本感兴趣(例如在 Ubuntu、Debian、SUSE、Arch 等上)
简单查询:我刚刚意识到我从未在脚本顶部看到过shebang.bashrc,这让我认为系统在登录时使用默认shell 来获取它(${SHELL})。我正在思考为什么会出现这种情况,即使用默认 shell 以外的其他东西来运行登录脚本是否被认为是一个坏习惯。
是否有可能有一个shebang,而不是指定解释器的路径,而是具有解释器的名称,并让shell通过$PATH找到它?
如果没有,有什么原因吗?
在Apache httpd 项目的“support/apxs.in”脚本中,@在#!. 也就是说,脚本的第一行是:
#!@perlbin@ -w
Run Code Online (Sandbox Code Playgroud)
这是 Perl 的东西还是 UNIX 内核的东西?换句话说,可以使用path/to/script/script_name.in?
如果没有,那么用#!?启动脚本的原因是什么?
我见过几个带有以下shebang的shell脚本:
#!/bin/bash -x -v
Run Code Online (Sandbox Code Playgroud)
但是,如果它们完全属于,man bash则不会解释这些论点-x和-v代表什么bash。
那么这些-x和-v(以及其他可能的论点)是什么意思?
假设我帐户的默认 shell 是 zsh,但我打开了终端并启动了 bash 并执行了一个名为 的脚本prac002.sh,哪个 shell 解释器将用于执行脚本,zsh 还是 bash?考虑以下示例:
papagolf@Sierra ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf
[sudo] password for papagolf:
papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh
# papagolf's default shell is zsh
papagolf@Sierra ~/My Files/My Programs/Learning/Shell % bash
# I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.)
papagolf@Sierra:~/My Files/My Programs/Learning/Shell$ ./prac002.sh
Enter username : Rex
Rex
# Which interpreter did it just use?
Run Code Online (Sandbox Code Playgroud)
**编辑:** 这是脚本的内容
papagolf@Sierra ~/My Files/My Programs/Learning/Shell …Run Code Online (Sandbox Code Playgroud) “shebang”是“bang she”的意思吗?
为什么不把“hebang”改成“bang he”呢?
从POSIX 规范的Shell 命令语言页面:
如果 shell 命令文件的第一行以字符“#!”开头,则结果未指定。
为什么#!POSIX 未指定的行为?我觉得令人困惑的是,如此便携和广泛使用的东西会有未指明的行为。
有没有办法动态选择正在执行脚本的解释器?我有一个在两个不同系统上运行的脚本,我想使用的解释器位于两个系统上的不同位置。我最终不得不在每次切换时更改 hashbang 行。我想做一些与此逻辑等效的事情(我意识到这种确切的构造是不可能的):
if running on system A:
#!/path/to/python/on/systemA
elif running on system B:
#!/path/on/systemB
#Rest of script goes here
Run Code Online (Sandbox Code Playgroud)
或者更好的是这样,以便它尝试使用第一个解释器,如果没有找到,则使用第二个解释器:
try:
#!/path/to/python/on/systemA
except:
#!path/on/systemB
#Rest of script goes here
Run Code Online (Sandbox Code Playgroud)
显然,我可以
根据我所在的位置/path/to/python/on/systemA myscript.py
或
/path/on/systemB myscript.py根据我所在的位置来执行它
,但我实际上有一个启动的包装脚本myscript.py,所以我想以编程方式而不是手动指定 python 解释器的路径。
shebang ×10
shell ×5
bash ×3
shell-script ×3
scripting ×2
zsh ×2
bashrc ×1
exec ×1
gnu-screen ×1
history ×1
interpreter ×1
perl ×1
portability ×1
posix ×1
profile ×1
terminology ×1