代码之家  ›  专栏  ›  技术社区  ›  Sumit Bohemian

在脚本执行过程中,如何将正在使用的shell从Dash(或sh)更改为Bash?

  •  2
  • Sumit Bohemian  · 技术社区  · 3 年前

    假设有一个脚本使用了某种Bash功能,比如数组。但假设脚本正在使用 sh 在Ubuntu上,Dash是一个不支持数组的shell。我们还假设我从一开始就无法控制使用哪个shell,也就是说,我只能使用Dash来启动脚本。

    假设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

    2 回复  |  直到 3 年前
        1
  •  1
  •   oguz ismail FCulig    3 年前

    Bash总是设置 BASH_VERSION 。您可以检查它是否已设置,然后使用bash重新启动脚本,否则如下所示:

    if [ -z "$BASH_VERSION" ]; then
      exec bash "$0" "$@"
    fi
    
    my_array=(yay i can use arrays now)
    
    # ...
    
        2
  •  1
  •   user1934428    3 年前

    不要对抗系统:因为根据你的帖子 知道 在这种情况下,调用将是 sh myscript.sh -也就是说,调用者假设您在这里有一个sh脚本——将它写得很小 sh 使用以下代码编写脚本:

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

    你真正的bash代码在 myscript.bash ,在那里您可以使用数组和其他bash功能。

    如果您愿意,此设计还允许您最终切换到其他语言(zsh、ruby…)。

        3
  •  0
  •   millerluki    3 年前

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

    ps -p $$ -o exe=
    

    这个命令的输出应该类似于“/usr/bin/bash”。 正如Jetchill已经提到的,强制命令使用bash-shell,如下所示:

    bash -c SOME_COMMAND
    

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

    #!/bin/bash
    
    some commands
    

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

    推荐文章