после запуска программы оставьте интерактивную оболочку для использования - PullRequest
9 голосов
/ 02 июня 2011

Я хочу запустить любую программу, заданную в качестве аргумента, через оболочку, а затем оставить эту оболочку в качестве интерактивной оболочки для использования позже.

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

Но она не работает с zsh

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

а также, если кто-то знает более совершенный способ сделать это, пожалуйста, дайте мне знать.

Ответы [ 4 ]

3 голосов
/ 02 июня 2011

Подход 1: bash, zsh и несколько других оболочек читают файл, имя которого находится в переменной окружения ENV после обычных файлов rc и перед выполнением интерактивных команд или сценария.Однако bash делает это только если вызывается как sh, а zsh делает это только если вызывается как sh или ksh, что довольно ограничивает.

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

Подход 2: заставьте оболочку читать другой файл 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
2 голосов
/ 06 июня 2011

Почему бы вам просто не запустить новую оболочку для интерактивного ввода?

#!/bin/sh
$@
exec zsh
0 голосов
/ 07 сентября 2012
$ 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
$ 
$

Оболочка оставлена ​​для вас, чтобы выполнять другую работу.В моем вопросе STDIN оболочки bash был HEREDOC (<< EOF), поэтому он не работал для команды, которая хочет читать из TTY.Но после ввода команды из / dev / tty она начинает работать. </p>

Я не могу найти способ исправить предупреждение

stty: standard input: Inappropriate ioctl for device
0 голосов
/ 02 июня 2011

Я использую это в скрипте для вызова программ с графическим интерфейсом из оболочки, хотя я не тестировал его с помощью zsh

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