zshを呼び出してコマンドを実行し、終了する代わりに対話モードに入ります


30

私はに似たzshを開始したい

zsh -c 'my_prog option1 option2'

しかし、そのコマンドを実行した後に終了する代わりに、呼び出されたzshの小道具のままになります(どこから呼び出されたかではありません)。これの特定のユースケースはscreenrcファイルにあり、次のようなことができます:

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

そして、そのコマンドを実行した後、閉じる代わりにシェルが残っています。

回答:


24

私はこれを行うことをお勧めしますが。

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

画面を操作したり、$STY変数を使用したりできる他のトリックもあります。

個々の画面でzshから何かを実行したい場合は、.zshrcまたは.zlogin内の$ STY変数を確認できます。それはフォーマットにあります<PID>.<TTY>.<HOSTNAME>

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

画面内にあり、~/.zsh-<TTY>($ STY変数から)存在する場合は、それを入手して、陽気な方法で続行します。対話型シェルを呼び出す前に環境変数を設定することもできます。

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

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

これらのチェックを.zshrc / .zloginに追加します。


SHLVLについて教えてくれた名誉
Nicolas Dumazet

私はネストされたシェルを避けたいと思っていましたが、まあまあです。
オートプレクティック

13

私はここで余分なシェルなしで動作するソリューションを見つけました。追加:

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

.zshrcに移動してから、zshを呼び出します

zsh -is eval 'your shell command here'

一度にたくさんのシェルを起動するのに本当に素晴らしい。


6

; exec zshコマンドに追加するのはどうですか?そうすれば、最後に残っているシェルは1つだけです。


5
あなたが実際にexecを必要としない場合; zsh -i、それはすでにあなたのためにそれを行います。
ダレンホール

4

私はeval "$RUN"私の終わりにあります.zshrc。これで、追加のシェルなしでコマンドを実行できます。

RUN='my_prog opt1 opt2' zsh

これは奇妙なクラッジのようです-しかし、それはとてもうまくいきます!
zaTricky
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.