/ / po spustení programu opustiť interaktívny shell na použitie - bash, shell, exec, zsh

po spustení programu nechajte interaktívny shell použiť - bash, shell, exec, zsh

Chcem spustiť ľubovoľný program, ktorý je daný argumentom, cez shell potom chcete, aby shell zostal ako interaktívny shell pre neskoršie použitie.

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

Ale to s zsh nefunguje

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

ako aj, ak niekto vie, že je lepšie spôsob, ako to urobiť prosím daj mi vedieť.

odpovede:

3 pre odpoveď č. 1

Prístup 1: bash, zsh a niekoľko ďalších shellov číta súbor, ktorého meno je v ENV premenná prostredia po obvyklých rc súboroch apred interaktívnymi príkazmi alebo spustením skriptu. Avšak bash to robí iba vtedy, ak je vyvolaný ako sh, a zsh to robí iba vtedy, ak je vyvolaný ako sh alebo ksh, čo je skôr obmedzujúce.

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

Prístup 2: aby shell prečítal iný rc súbor, ktorý obsahuje obvyklý rc súbor a obsahuje volanie programu, ktorý chcete spustiť. Napríklad pre bash:

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

Pre zsh je potrebné zavolať súbor .zshrc, môžete zadať iba iný adresár.

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 pre odpoveď č. 2

Prečo jednoducho nespustíte nový shell pre interaktívny vstup?

#!/bin/sh
$@
exec zsh

0 pre odpoveď č. 3

Používam to v skripte na zavolanie programov gui z shellu, ale nechcel to testovať pomocou zsh

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

0 pre odpoveď č. 4
$ cat ~/bin/ish
#!/bin/zsh
bash -i <<EOF
$@ < /dev/tty
exec <> /dev/tty
EOF

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

V tomto momente je vim otvorený.

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

shell je ponechaný pre vás robiť inú prácu. V mojej otázke bol bash shell STDIN HEREDOC (<< EOF) tak pre tak to nefunguje pre príkaz, ktorý chce čítať z TTY. Ale po zadaní príkazu od / dev / tty začne pracovať.

Nemôžem nájsť spôsob, ako opraviť upozornenie

stty: standard input: Inappropriate ioctl for device