web-dev-qa-db-ja.com

[-t 1]は何をチェックしますか?

Windowsでzshを起動するときにbashを起動する方法を見つけました

https://www.howtogeek.com/258518/how-to-use-zsh-or-another-Shell-in-windows-10/

.bashrcの最後に次のコードを追加することをお勧めします。

# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi

[ -t 1 ]の意味?

それは本当ですか?

次に、これを行うことができますか?

exec zsh
13
Jin Kwon

[]testコマンドのショートカットです。

man testによると:

-t FD
FDが端末に関連付けられているファイル記述子である場合はtrue。

したがって、bashを対話型シェル(ターミナル-用語の説明については this スレッドを参照)として実行している場合、bashはzshに置き換えられます。

。bash *ファイルの詳細:

Bashがインタラクティブログインシェルとして、または-loginオプション付きの非インタラクティブシェルとして呼び出されると、最初にファイル/ etc /からコマンドを読み取り、実行します。プロファイル(そのファイルが存在する場合)。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、および〜/ .profileをこの順序で検索し、存在し、読み取り可能な最初のコマンドからコマンドを読み取って実行します。シェルの起動時に--noprofileオプションを使用して、この動作を禁止できます。

ログインシェルが終了するの場合、bashは〜/ .bash_logoutファイルと/etc/bash.bash_logoutファイルからコマンドを読み取り、ファイルが存在する場合は実行します。

ログインシェルではないインタラクティブシェルを起動すると、bashは〜/ .bashrcからコマンドを読み取り、実行します(そのファイルが存在する場合)。 --norcオプションを使用すると、これを禁止できます。 --rcfile fileオプションは、bashが〜/ .bashrcではなくfileからコマンドを読み取って実行するように強制します。

StéphaneChazelasコメント:
シェルはstdoutが端末でなくても対話型であり、シェルはstdout上の端末と非対話型である可能性があることに注意してください(出力をリダイレクト/パイピングせずに端末内でスクリプトを実行するときと同様)。 bashは、インタラクティブでない場合でも.bashrcを読み取ることができます(ssh Host cmdのようにbashはホスト上のユーザーのログインシェル、またはbash --login -c 'some code')。 case $- in *i*)...は、シェルがインタラクティブかどうかをテストする正しい方法です。

14
mrc02_kr

テストコマンド[ -t 1 ]は、bashの出力が端末にあるかどうかを確認します。この行の目的は、ターミナルを開くときに、他のbashの使用を妨げることなくzshを実行することです。しかし、それは非常にひどく行われています。

ファイル.bashrcは、次の3つの状況で読み込まれます。

  • Bashがインタラクティブシェルとして実行される場合、つまり、バッチコマンドを実行するのではなく、ユーザーが入力したコマンドを実行する場合。
  • Bashがnon-interactiveシェルの場合、RSHまたはSSHデーモンによって実行されます(通常、ssh Host.example.com somecommandを実行し、bashがログインです) Host.example.comのシェル)。
  • 明示的に呼び出されたとき。ユーザーの.bash_profile内( bashのスタートアップファイルの選択は少し奇妙です )。

[ -t 1 ]は、インタラクティブシェルを検出するための不適切な方法です。端末に送信されない標準出力でbashをインタラクティブに実行することは可能ですが、まれです。標準出力を非対話型シェルの端末に送信するのがより一般的です。非対話型シェルは.bashrcを実行するビジネスがありませんが、残念ながらSSHによって呼び出されたbashシェルは実行します。はるかに優れた方法があります。bash(およびその他のshスタイルのシェル)には、組み込みの信頼性の高い方法が用意されています。

case $- in
  *i*) echo this Shell is interactive;;
  *) echo this Shell is not interactive;;
esac

したがって、「これがインタラクティブシェルの場合はzshを起動します」と記述します

case $- in
  *i*) exec zsh;;
esac

しかし、それは良い考えではありません。それは、bashシェルを開くのを防ぎます。これは、zshを使用する場合でも役立ちます。このブログ投稿を忘れて、代わりにターミナルを開くショートカットを設定して、bashの代わりにzshを実行します。 「WindowsでBashアプリケーションを開くたびに、Zshシェルで起動するように」配置しないでください。zshが必要な場合は、Zshアプリケーションを開きます。

man 1テスト

-t FD

ファイル記述子FDが端末で開かれている

あなたの例は、stdoutがターミナル(ファイル/パイプ/ etcではない)で開いている場合、bashをオンにして実行プロセスを置き換えます(この場合、zshを置き換えます) 。

5
sebasth