aktifkan zsh, setelah menjalankan perintah, lalu masuk ke mode interaktif alih-alih keluar

32

Saya ingin memulai zsh mirip dengan

zsh -c 'my_prog option1 option2'

tetapi bukannya keluar setelah menjalankan perintah itu, meninggalkan saya di propt dari zsh yang dipanggil (tidak dari mana pun ia dipanggil). satu kasus penggunaan khusus untuk ini adalah dalam file screenrc, Anda dapat melakukan sesuatu seperti:

screen -t my_prog 0 zsh -c 'my_prog opt1 opt2'

dan setelah menjalankan perintah itu Anda tinggal dengan sebuah shell di sana alih-alih menutup.

Autoplektik
sumber

Jawaban:

24

Bukannya saya akan menyarankan melakukan ini.

(sirius)~: zsh -c 'print hello; zsh -i'
hello
(sirius)~: echo $SHLVL
2

Ada trik lain yang bisa Anda mainkan dengan layar dan menggunakan $STYvariabel.

Jika Anda ingin sesuatu dijalankan dari zsh dengan layar tersendiri, Anda dapat memeriksa variabel $ STY di dalam .zshrc atau .zlogin Anda. Itu dalam format <PID>.<TTY>.<HOSTNAME>.

if [[ -n $STY ]] then
  if [[ -f ~/.zsh-$STY[(ws:.:)2] ]] then
    . ~/.zsh-$STY[(ws:.:)2]
  fi
fi

Jika di layar, dan jika ~/.zsh-<TTY>(dari variabel $ STY) ada, sumber itu, kemudian lanjutkan dengan cara selamat Anda. Anda juga dapat mengatur variabel lingkungan sebelum memanggil shell interaktif.

> FOO=bar zsh -i
> env | grep FOO
FOO=bar

> RUNTHISCOMMAND=/path/to/script zsh -i
.zshrc:
if [[ -n $RUNTHISCOMMAND ]] then
   $RUNTHISCOMMAND
fi

Tambahkan cek-cek itu ke .zshrc / .zlogin Anda.

Aula Darren
sumber
pujian untuk mengajari saya tentang SHLVL
Nicolas Dumazet
Saya berharap untuk menghindari cangkang bersarang, tapi oh well.
Autoplektik
14

Saya menemukan solusi yang bekerja tanpa shell tambahan di sini . Menambahkan:

if [[ $1 == eval ]]
then
    "$@"
set --
fi

ke .zshrc, lalu panggil zsh dengan

zsh -is eval 'your shell command here'

Sangat bagus untuk memulai banyak kerang sekaligus.

gravitasi
sumber
6

Bagaimana dengan menambahkan ; exec zshperintah? Dengan begitu hanya ada satu shell yang tersisa di akhir.

TRS-80
sumber
5
Anda sebenarnya tidak perlu eksekutif jika Anda ; zsh -isudah melakukannya untuk Anda.
Darren Hall
4

Saya memiliki eval "$RUN"pada akhir saya .zshrc. Saya sekarang dapat menjalankan perintah tanpa shell tambahan, dengan:

RUN='my_prog opt1 opt2' zsh
Zaz
sumber
Ini sepertinya kludge yang aneh - tetapi itu bekerja dengan sangat baik!
zaTricky