別のシェルを使用してxtermを起動し、コマンドを実行します。

別のシェルを使用してxtermを起動し、コマンドを実行します。

私のデフォルトのシェル環境は、いくつかのコマンドを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/.profilezshでSHELL環境変数を設定することもできます。export SHELL=/bin/zsh

関連情報