depois de executar o programa deixar shell interativo para usar

9

Eu quero rodar qualquer programa dado como argumento, através do shell quero que o shell tenha saído como shell interativo para usar depois.

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

Mas não está funcionando com zsh

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

bem como se alguém conhece uma maneira mais aprimorada de fazer isso por favor me avise.

    
por Sharad 02.06.2011 в 20:43
fonte

4 respostas

3

Abordagem 1: bash, zsh e alguns outros shells lêem um arquivo cujo nome está na variável de ambiente ENV após os arquivos rc usuais e antes dos comandos interativos ou do script a ser executado. No entanto bash só faz isso se invocado como sh, e zsh só faz isso se invocado como sh ou ksh, o que é bastante limitante.

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

Abordagem 2: faça o shell ler um arquivo rc diferente, que origina o arquivo rc usual e contém uma chamada para o programa que você deseja executar. Por exemplo, para bash:

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

Para zsh, o arquivo deve ser chamado .zshrc , você só pode especificar um diretório diferente.

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
    
por Gilles 02.06.2011 / 21:32
fonte
2

Por que você simplesmente não inicia um novo shell para entrada interativa?

#!/bin/sh
$@
exec zsh
    
por Sec 05.06.2011 / 23:38
fonte
0

Eu uso isso em um script para chamar programas de gui a partir do shell, não testei com zsh embora

nohup $@ >/dev/null 2>/dev/null &
    
por Kim Stebel 02.06.2011 / 21:06
fonte
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

Neste ponto, o vim é aberto.

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

shell é deixado para você fazer outro trabalho. Na minha pergunta, o STDIN do shell bash era HEREDOC (< < EOF), por por isso não funciona para o comando que deseja ler a partir do TTY. Mas depois de fornecer a entrada de comando do / dev / tty, ele começa a funcionar.

Não consigo descobrir como corrigir o aviso

stty: standard input: Inappropriate ioctl for device
    
por Sharad 07.09.2012 / 16:17
fonte