似乎要么我不明白这些选项的含义,要么 bash 的行为相同(作为读取标准输入的交互式 shell),无论如何都没有任何选项。我什么时候想明确使用这些选项?
参考手册对如何调用 Bash有非常详细的描述。不过,我更喜欢以稍微不同的方式记录它:
bash <options> <script_file> [<arguments>]
bash <options> -c <command_string> [<arguments>]
bash <options> [-s [<arguments>]
Run Code Online (Sandbox Code Playgroud)
前两个是非交互式的,因此没有相关的功能(提示、作业控制、命令历史等);但是,如果您需要这些功能,您可以使用 -i 标志强制执行它们。
第三个是交互式的,可选的 -s 标志在下面的段落中是合理的......
示例 1:基本
-s 选项可用于指定参数:
bash -s a b c
Run Code Online (Sandbox Code Playgroud)
启动一个shell...在这个shell中我们可以检查参数:
echo $1 $2 $2
Run Code Online (Sandbox Code Playgroud)
反映来自 bash 命令的参数:
a b c
Run Code Online (Sandbox Code Playgroud)
如果没有 '-s' 选项,第一个位置参数将被解释为文件名:
bash a b c
Run Code Online (Sandbox Code Playgroud)
给
bash: a: No such file or directory
Run Code Online (Sandbox Code Playgroud)
示例 2:使用 heredoc
之前使用的 -s 选项可用于为 heredoc 提供参数(当您不想使用文件嵌入命令时):
bash -s a b c <<'EOC'
echo $1 $2 $3
EOC
Run Code Online (Sandbox Code Playgroud)
给出:
a b c
Run Code Online (Sandbox Code Playgroud)
注意bash命令执行heredoc中的命令,然后退出;这会将您带回调用 bash 命令的 shell。
示例 3:流水线
考虑在管道中嵌入 bash(当你需要实现一些内联脚本时),再次提供参数的机会可以被利用
echo 'echo HELLO $1' | bash -s WORLD
Run Code Online (Sandbox Code Playgroud)
给出:
HELLO WORLD
Run Code Online (Sandbox Code Playgroud)
这是一个人为的例子,但对于一些更复杂的脚本(带有heredoc!),这可以派上用场......
据我所知,它似乎用于测试目的。启动文件可以使用它来测试状态以及 shell 脚本。
默认情况下,当您调用 bash shell 时,它使用 -i 和 -s,因此我假设出于测试目的,您可以通过脚本或文件使用这些选项显式调用 shell,以测试正常登录 bash shell 将提供的状态。
我在注释中指出的调用 Esref 下的手册页中找到了该信息。但这可能不太容易理解,因为这似乎不是一个人通常会做的事情。