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ď č. 1Prí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