运行程序后离开交互式shell使用

时间:2011-06-02 18:43:45

标签: bash shell exec zsh

我想通过shell运行任何作为参数给出的程序 希望将shell保留为交互式shell,以便以后使用。

#!/bin/bash
bash -i <<EOF
$@
exec <> /dev/tty
EOF

但它无法使用zsh

#!/bin/bash
zsh -i <<EOF
$@
exec <> /dev/tty
EOF

以及如果有人知道更多改进的方法 请告诉我。

4 个答案:

答案 0 :(得分:3)

方法1:bash,zsh和其他一些shell在通常的rc文件之后和交互式命令或运行脚本之前读取名称在ENV环境变量中的文件。但是bash只在调用为sh时执行此操作,而zsh仅在调用sh或ksh时执行此操作,这是相当有限的。

temp_rc=$(mktemp)
cat <<'EOF' >"$temp_rc"
mycommand --option
rm -- "$0"
EOF
ENV=$temp_rc sh

方法2:让shell读取一个不同的rc文件,该文件从通常的rc文件中获取并包含对要运行的程序的调用。例如,对于bash:

temp_rc=$(mktemp)
cat <<'EOF' >"$temp_rc"
mycommand --option
if [ -e ~/.bashrc ]; then . ~/.bashrc; fi
rm -- "$0"
EOF
bash --rcfile "$temp_rc"

对于zsh,该文件必须被称为.zshrc,您只能指定不同的目录。

temp_dir=$(mktemp -d)
cat <<'EOF' >"$temp_dir/.zshrc"
mycommand --option
if [ -e ~/.zshrc ]; then . ~/.zshrc; fi
rm -- $0; rmdir ${0:h}
EOF
ZDOTDIR=$temp_dir zsh

答案 1 :(得分:2)

为什么不简单地为交互式输入启动一个新shell?

#!/bin/sh
$@
exec zsh

答案 2 :(得分:0)

我在脚本中使用它来从shell调用gui程序,但是没有用zsh测试过它

nohup $@ >/dev/null 2>/dev/null &

答案 3 :(得分:0)

$ cat ~/bin/ish
#!/bin/zsh
bash -i <<EOF
$@ < /dev/tty
exec <> /dev/tty
EOF

$
$
$ ~/bin/ish vim
stty: standard input: Inappropriate ioctl for device

此时打开vim。

$ vim < /dev/tty
$ exec <> /dev/tty
$ 
$

shell留给你做其他工作。 在我的问题中,bash shell的STDIN是HEREDOC(&lt;&lt; EOF)所以 所以它不适用于想要从TTY读取的命令。 但是在从/ dev / tty提供命令输入后,它开始工作。

我无法找到如何纠正警告

stty: standard input: Inappropriate ioctl for device