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.

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.


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.


6

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


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

Ini sepertinya kludge yang aneh - tetapi itu bekerja dengan sangat baik!
zaTricky
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.