外壳内壳脚本壳



我想连接到不同的外壳(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'

zshfish也使用-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中编码您的脚本以安全地传输到远程外壳。

相关内容

  • 没有找到相关文章