bash 的 -i 和 -s 选项的目的是什么?

Max*_*kov 2 bash

似乎要么我不明白这些选项的含义,要么 bash 的行为相同(作为读取标准输入的交互式 shell),无论如何都没有任何选项。我什么时候想明确使用这些选项?

Fla*_*aco 5

看待 Bash 调用的另一种方式

参考手册对如何调用 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!),这可以派上用场......


dak*_*kka 2

据我所知,它似乎用于测试目的。启动文件可以使用它来测试状态以及 shell 脚本。

默认情况下,当您调用 bash shell 时,它使用 -i 和 -s,因此我假设出于测试目的,您可以通过脚本或文件使用这些选项显式调用 shell,以测试正常登录 bash shell 将提供的状态。

我在注释中指出的调用 Esref 下的手册页中找到了该信息。但这可能不太容易理解,因为这似乎不是一个人通常会做的事情。