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


13

私はちょうど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

回答:


14

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

によるとman test

-t FD
FDが端末に関連付けられているファイル記述子の場合、真です。

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

.bash *ファイルの詳細:

bashが対話型ログインシェルとして、または--loginオプションを指定した非対話型シェルとして 呼び出されると、bashは最初にファイル/ etc / profileが存在する場合、そのファイルからコマンドを読み取って実行します。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、および〜/ .profileをこの順序で探し、最初に存在して読み取り可能なコマンドからコマンドを読み取り、実行します。--noprofileオプションは、この動作を禁止するためにシェルを開始するときに使用できます。

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

場合は ログインシェルではありませんインタラクティブシェルが起動され、bashはからコマンドを読み込み、実行〜/ .bashrcにそのファイルが存在する場合は、。--norcオプションを使用すると、これを禁止できます。--rcfile fileオプションは、bashに〜/ .bashrcの代わりにfileからコマンドを強制的に読み取らせて実行させます。

ステファンChazelasコメント:
シェルはstdoutが端末であるなしにインタラクティブにすることができ、シェルは標準出力の端子と非対話できることに注意してください(いつでも好きですが、その出力をパイプ/リダイレクトせずに端末内のスクリプトを実行)、およびbashCAN .bashrc対話的でない場合でも(ホスト上のユーザーのログインシェルがssh host cmdどこbashにあるか、またはなどbash --login -c 'some code')でも読み取ります。case $- in *i*)...シェルがインタラクティブかどうかをテストする正しい方法です。


4
シェルはstdoutが端末でなくても対話型であり、シェルはstdoutの端末と非対話型である場合があり(出力をリダイレクト/パイピングせずに端末内でスクリプトを実行する場合など)、そうでない場合でもbash読み取ることができます .bashrcインタラクティブ(のようにssh host cmdここでbashホスト上のユーザのログインシェルであり、又はbash --login -c 'some code'ここ.bash_profile.bashrc)。case $- in *i*)...シェルがインタラクティブかどうかをテストする正しい方法です。
ステファンシャゼラス

@StéphaneChazelas良い点。私は答えにあなたのコメントが含まれます
-mrc02_kr

「インタラクティブ」にはさまざまな定義があります。シェルがいる場合と考えて、それは対話的で、その後、i設定されます(と現代のシェルにしてテストすることができ、そのif代わりに使用することのcase)。しかし、stdout(またはstdin、またはstderr ...)が端末に接続されている場合にのみ気にする多くのユースケースがあります。
マークリード

9

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

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

  • bashが対話型シェルとして実行される場合、つまり、バッチコマンドを実行するのではなく、ユーザーが入力したコマンドを実行する場合。
  • bashがRSHまたはSSHデーモンによって実行される非対話型シェルである場合(通常、実行ssh host.example.com somecommandしていてbashがログインシェルであるためhost.example.com)。
  • ユーザーの場合など、明示的に呼び出されたとき.bash_profilebashのスタートアップファイルの選択は少し奇妙です)。

[ -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アプリケーションを開きます。


以下のために rsh/ sshそれはだ場合および対話型シェルのために、それはだないログインシェル。ログインシェルの場合(sshd非対話型ログインシェルは起動しませんが、で起動できますssh host exec bash -l)、.bash_profile代わりに読み込まれます。またためにそのノートrsh/ ssh、あなたはまた、必要な$SHLVL設定を解除または0に
ステファンChazelas

5

男1テスト

-t FD

ファイル記述子FDが端末で開かれます

サンプルは、stdoutが(ファイル/パイプ/などではなく)ターミナルで開いている場合bashzshon で実行されます(この場合、実行中のプロセスを置き換えます)。

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