我想连接到不同的外壳(CSH,ksh等),并在每个交换机内执行命令。
以下是反映我意图的示例程序:
#!/bin/bash
echo $SHELL
csh
echo $SHELL
exit
ksh
echo $SHELL
exit
既然,我对外壳脚本的精通不太精通,需要关于如何实现这一目标的指针。任何帮助将不胜感激。
如果要执行一个命令,则可以使用-c
选项
csh -c 'echo $SHELL'
ksh -c 'echo $SHELL'
如果要执行多个命令,甚至要在子壳中执行整个脚本,则可以使用bash的此处文档功能,并在子壳上使用-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
所处的外壳,因为父壳展开了此变量到文本/././bash
。如果您想确定子外壳工作,则应检查是否有壳特定的语法工作。
可以使用每个Shell提供的命令行选项来运行代码段。
例如,对于bash
,请使用-c
选项:
bash -c $code
bash -c 'echo hello'
zsh
和fish
也使用-c
选项。
其他外壳将说明他们在男人页面中使用的选项。
如果要通过bash启动上传递命令,则需要使用-c
命令行选项:
#!/bin/bash
# We are in bash already ...
echo $SHELL
csh -c 'echo $SHELL'
ksh -c 'echo $SHELL'
您可以使用-c
选项将任意复杂脚本传递给外壳,如
sh -c 'echo This is the Bourne shell.'
,如果您将调用包装在 stdin 上的脚本中,则可以节省与报价和可变扩展有关的许多头痛和可变扩展。
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恤或打破管道以控制传递给外壳的脚本。
如果要通过 ssh 在远程主机上执行脚本,则应考虑在基本64中编码您的脚本以安全地传输到远程外壳。