我想通过shell运行任何作为参数给出的程序 希望将shell保留为交互式shell,以便以后使用。
#!/bin/bash
bash -i <<EOF
$@
exec <> /dev/tty
EOF
但它无法使用zsh
#!/bin/bash
zsh -i <<EOF
$@
exec <> /dev/tty
EOF
以及如果有人知道更多改进的方法 请告诉我。
答案 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