Shell脚本:嵌套Shell

4
我希望能够连接到不同的shell(如csh、ksh等)并在切换后的每个shell中执行命令。
以下是反映我的意图的示例程序:
#!/bin/bash
echo $SHELL
csh
echo $SHELL
exit
ksh
echo $SHELL
exit

由于我不熟悉Shell脚本,需要指导如何实现这一点。非常感谢您的帮助。

4个回答

3

如果您只想执行单个命令,可以使用-c选项。

csh -c 'echo $SHELL'
ksh -c 'echo $SHELL'

如果您想在子shell中执行多个命令,甚至整个脚本,可以使用bash的here-document特性,并在子shell上使用-s(从stdin读取命令):

#!/bin/bash
echo "this is bash"

csh -s <<- EOF
    echo "here go the commands for csh"
    echo "and another one..."
EOF
echo "this is bash again"
ksh -s <<- EOF
    echo "and now, we're in ksh"
EOF

请注意,您不能轻易地通过echo $SHELL检查当前所在的shell,因为父shell会将此变量展开为文本/././bash。如果您想确保子shell正常工作,应该检查特定于shell的语法是否正常工作。


非常感谢您及时的帮助,也感谢其他提供类似解决方案的人。 - bprasanna

1

可以使用每个 shell 提供的命令行选项来运行代码片段。

例如,对于 bash,使用 -c 选项:

bash -c $code
bash -c 'echo hello'

zshfish 也使用 -c 选项。

其他 shell 将在其手册页中说明它们使用的选项。


1

如果您想在bash启动时传递命令,需要使用-c命令行选项:

#!/bin/bash
# We are in bash already ...
echo $SHELL

csh -c 'echo $SHELL'
ksh -c 'echo $SHELL'

1
您可以使用-c选项将任意复杂的脚本传递给Shell,例如:
sh -c 'echo This is the Bourne shell.'

如果你将调用包装在一个读取标准输入的函数中,就可以避免与引号和变量扩展相关的许多麻烦。示例代码如下:

execute_with_ksh()
{
  local script
  script=$(cat)
  ksh -c "${script}"
}

prepare_complicated_script()
{
   # Write shell script on stdout,
   #  for instance by cat-ting a here-document.
   cat <<'EOF'
echo ${SHELL}
EOF 
}

prepare_complicated_script | execute_with_ksh

这种方法的优点在于可以轻松地在管道中插入T型管或者断开管道来控制传递给shell的脚本。如果你想通过ssh在远程主机上执行脚本,你应该考虑将脚本编码为base64以安全地传输到远程shell。

1
看起来我漏掉了什么。$configfile 的意思是什么?它与这个问题有什么关系? - hek2mgl
@hek2mgl 嗯,我不知道!:) 新的例子可能更好。 - Michaël Le Barbier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接