私のデフォルトのシェル環境は、いくつかのコマンドをbash
起動しxterm
て実行したいものです。zsh
通常、いくつかのコマンドを実行するには、次のコマンドを使用します。
xterm -e "ls -lrt;pwd;whoami"
bash
これはシェルでコマンドを実行することですxterm
。
別のシェルを使用して起動するには、xterm
次のコマンドを使用します。
xterm -ls /bin/zsh
それでは、これら2つをどのように組み合わせることができますか?私が試したとき。次のエラーが発生します。
[dinesh@mypc]$ xterm -ls /bin/zsh -e "ls"
xterm: bad command line option "/bin/zsh"
この問題をどのように解決しますか?
答え1
いいえ、-ls
このオプションはxterm
引数を使用せず、実行されるシェルがログインシェルであるxterm
ことを指定します。
-ls
質問に関連する部分が強調表示されているフラグの全体部分は次のとおりです。
-ls このオプションは、起動するシェルを表します。 xtermウィンドウはログインシェルになります(つまり、最初の文字 argv[0] は、シェルに次を示すダッシュです。 ユーザーの.loginまたは.profileを読む必要があります。) -lsフラグに-eを使用し、loginShellリソースが無視される場合 また、xtermがシェルを作成する方法がわからないために提供されます。 与えられたコマンドを開始した後に何をしても ログインシェル - ユーザーが選択したシェルがBourneである必要はありません。 結局、それは殻です。また、xterm -e は以下を提供する必要があります。 これを必要とする他のアプリケーションに一貫した機能を提供 loginShellが次の場合は、ウィンドウでテキストモードプログラムを起動します。 無視しないと、 ~/.profile の結果が妨げられる可能性があります。 それ。 -ls と -e の効果を同時に取得するには、次のようにします。 同じものを削除 xterm -e /bin/bash -l -c "私のコマンドはここにあります。" 最後に、xterm -ls -e のため、-ls は完全に無視されません。 実際には/var/run/wtmpエントリを作成します(そのように設定した場合)。 xterm -e の場合はそうではありません。
答え2
xterm
$SHELL
コマンドラインは、保存されたシェル(ログインシェルにログインしたときに最初に設定された変数)を使用して解析されます。したがって、シェルにコマンドラインを解析させるには、zsh
次の手順を実行します。
SHELL=/bin/zsh xterm -e 'echo $ZSH_VERSION; sleep 4'
またはこれを行うこともできます:
xterm -e zsh -c 'echo $ZSH_VERSION; sleep 4'
複数の引数を渡すと、xterm
コマンドラインを解析するためにシェルは呼び出されず、最初の引数とその引数を直接実行しますexecvp()
。
答え3
@Stéphaneの答えに加えて、システムでzshを使用したい唯一の人なら、$HOME/.profile
zshでSHELL環境変数を設定することもできます。export SHELL=/bin/zsh