执行 bash 命令的好处

执行 bash 命令的好处

bash执行命令有什么好处?在我的终端窗口中,肉眼看不到任何事情发生。我注意到$SHLVL增加了,但除此之外我不知道它bash被执行了。另外,跑步bash --help并不能说明什么。我知道 bash 是可用的 shell 之一,但如果您已经在使用 Bourne Again shell,我认为嵌套它没有任何好处。我应该在什么场景下执行bash

答案1

bash如果您已经在运行shell,那么单独运行bash确实只有一个看似合理的好处 - 新 shell 将拥有一个“干净”的环境(尽管有任何exports)。

但是,如果您当前正在运行任何其他 shell 并想要调用bash脚本,并且其权限未使用正确的 shebang 行设置 +x (即可执行文件),则您可以使用它bash /path/to/script.sh来确保它使用正确的 shell 运行。

答案2

使用(或您启动的任何 shell)启动新的 shell 会话bash会设置一个新环境。它将从父 shell 会话继承任何环境变量1 。一旦新会话退出,其环境就被破坏。

除了将其用作显式解释器来执行脚本(以绕过#!脚本本身中的 -line )或在bash环境中执行特定命令之外bash -c,使用 just 启动交互式 shellbash可能对测试有用。

我一直使用它,因为我的登录 shell 不是ksh93bash而且这里的很多问题似乎都是关于bash。一旦我测试了我想要测试的内容,我就可以exit(或Ctrl+D)恢复我的可信ksh93会话,而不会受到环境中临时变量的任何污染。

bash当然,即使我的登录 shell 是 ,我也会这样做。

事实上,我什至有一个用于启动干净bash会话的小 shell 函数。它本质上是运行env -i bash(启动时bash不会将任何环境变量传输到新会话),但也会创建一个临时工作目录。退出后,该目录将被 shell 函数删除。

1 环境变量是已导出的 shell 变量。


如果有人有兴趣:

function shell
{
    # Starts the specified shell in a clean environment (save for HOME,
    # TERM and SHELL) and with an empty temporary working directory.
    # The working directory is deleted upon exiting the shell session.
    # If no shell name is given, the shell is infered from $SHELL.

    typeset shell="$( basename "${1:-$SHELL}" )"

    typeset realshell="$( grep "^[^#].*/$shell\$" /etc/shells )"

    if [[ -z "$realshell" ]] || [[ ! -x "$realshell" ]]; then
        printf 'No such shell: %s\n' "$shell" >&2
        return 1
    fi

    tmpcwd="$( mktemp -d "${TMPDIR:-/tmp}/shell-$shell.XXXXXXXX" )"
    trap 'printf "Removing %s\n" "$tmpcwd" >&2; rm -rf "$tmpcwd"' EXIT

    printf 'Starting %s in %s\n' "$realshell" "$tmpcwd" >&2

    (
        cd "$tmpcwd" &&
        env -i  SHELL="$realshell" \
                TERM="$TERM" \
                HOME="$HOME" \
                "$realshell"
    )
}

使用它(为了可读性插入额外的换行符):

$ shell bash
Starting /usr/local/bin/bash in /tmp/shell-bash.mqUhTkBF

bash-4.4$ ls

bash-4.4$ env
PWD=/tmp/shell-bash.mqUhTkBF
HOME=/home/kk
TERM=rxvt
SHELL=/usr/local/bin/bash
SHLVL=1
_=/usr/bin/env

bash-4.4$ exit
exit
Removing /tmp/shell-bash.mqUhTkBF

相关内容