ubuntu 如何在脚本执行期间将正在使用的shell从Dash(或sh)更改为Bash?

oalqel3c  于 2023-05-28  发布在  Shell
关注(0)|答案(3)|浏览(197)

假设有一个脚本使用了某个Bash特性,比如数组。但是,假设该脚本在Ubuntu上使用sh运行,这是一个不支持数组的shell。让我们还假设我不能控制从一开始就使用哪个shell,即。我只能用达什来开始剧本
假设Bash二进制文件的位置是已知的,并且可以安全地假设是一致的,那么是否可以检测并从Dash(或任何其他shell)切换到Bash?例如,我使用sh myscript.sh运行以下脚本:

#!/bin/sh

# Do something here to detect Dash and switch to Bash (/bin/bash)

my_array=(yay i can use arrays now)

# ...

请注意,脚本必须使用sh myscript.sh运行,我无法将其更新为bash myscript.sh

xzlaal3s

xzlaal3s1#

Bash总是设置BASH_VERSION。你可以检查它是否被设置,然后用bash重新启动脚本,否则像这样:

if [ -z "$BASH_VERSION" ]; then
  exec bash "$0" "$@"
fi

my_array=(yay i can use arrays now)

# ...
332nm8kg

332nm8kg2#

不要与系统对抗:因为根据你的帖子,你知道在这个上下文中,调用将是sh myscript.sh-即。调用者假设你在这里有一个sh脚本-用下面的代码将它写成tiny sh 脚本:

#!/bin/sh
# This is myscript.sh
/path/to/your/bash /path/to/your/myscript.bash "$@"

您真实的的bash代码在myscript.bash中,您可以在其中使用数组和其他bash好东西。
如果你愿意,这种设计还允许你最终切换到其他语言(zsh,ruby,...)。

brccelvz

brccelvz3#

您可以使用以下命令检查脚本中当前使用的shell:

ps -p $$ -o exe=

这个命令的输出应该类似于“/usr/bin/bash”。正如Jetchisel已经提到的,强制命令使用bash shell,像这样使用它:

bash -c SOME_COMMAND

您也可以在文件顶部使用shebang来使用特定的shell。

#!/bin/bash

some commands

并使用./my_script. bash调用脚本。确保你的脚本是可执行的。

相关问题