シェルで「< ./somefile.txt」を実行するとどうなりますか?

シェルで「< ./somefile.txt」を実行するとどうなりますか?

だから私は< ./somefile.txtシェルで実行していましたが、何もしませんでした(テキストファイルには有効なLinuxコマンドがありました)。では、テキストファイルの内容はどこにリダイレクトされますか?私はそれがnullだと推測していますが、わかりません。

オペレーティングシステム:Ubuntu 12.04

答え1

だから私はちょうどLinuxシェルで "< ./somefile.txt"を実行しました。

bashと同様のシェルではdashありません実装する注文。それはただ分配する somefile.txt標準入力として。コマンドを指定しないと、stdinは使用されないため、何もしません。

stdinで作業を行うには、以下を試してくださいcat

cat <./somefile.txt

標準入力が標準出力に反映されるため、cat端末にファイルが表示されることがわかります。

一方、実際にスクリプトを実行するには、次のようにサブシェルで実行できます。

bash ./somefile.txt

または(a)somefile.txtに実行可能なビットセット()があり、chmod +x somfile.txt(b)が完全にsh互換性がある場合、または最初の行に適切なshebang(たとえば#!/bin/bash)がある場合は、次のようにします。

./somefile.txt

または現在のシェル(つまりそれを得るために)以下を実行してください:

. ./somefile.txt

または:

source ./somefile.txt

通常、現在の作業ディレクトリと現在のシェル環境の他の側面を変更したい場合は、スクリプトを取得します。そのような副作用がない場合は、それをサブシェルで実行しないでください。

高度な使い方

<./somefile.txt@StéphaneChazelasは、これがファイルを読み取ることができるかどうかをテストするのに./somefile.txt役立つと指摘しました。たとえば./somefile.txt、読み取れない場合はコード 1 で終了します。

<./somefile.txt || exit 2

これは、シェルが./somefile.txt読み取り可能なstdinにのみ割り当てることができるために機能します。それ以外の場合、シェルはエラーメッセージを表示し、コード1を返します。このコードは "or()句をトリガします。||この場合、スクリプトはコード2で終了します。同じテストでは、次のようになります。

[ -r "./somefile.txt" ]  || exit 2

答え2

シェルによって異なります。 zshの場合、これは「コマンドレスリダイレクト」セクションで説明されています。デフォルトではがREADNULLCMDコマンドとして使用され、デフォルト値はですmore

答え3

あなたが持っているのは、リダイレクトを含む空のコマンドです。使用中のシェルが指定されていません。 vinc17はzshで空のコマンドを処理する問題を解決します。 Bashでは空のコマンドは何もしません。空のスクリプトと同じです。次の行の間を読むと、これを推論できます。バッシュリファレンスマニュアル:

単純なコマンドを実行すると、シェルは次の拡張、割り当て、および操作を実行します。リダイレクト、左から右へ。
                ︙
コマンド名の結果がない場合は、リダイレクトを実行します。ただし、現在のシェル環境には影響しません。リダイレクトエラーのため、コマンドはゼロ以外の状態で終了します。

(強調追加) つまり、

<ファイル名

開いているファイル名それから何もしないでください。オープンが失敗すると、シェルはエラーメッセージを出力します。いずれにせよ、終了状態($?)は適切に設定されます(成功は0、失敗は1)。これは次のとおりです。

睡眠0 <ファイル名

sleep標準入力が読み取れないためです。

やや興味深いバリエーションは次のとおりです。

>ファイル名

これはファイル名それから何もしないでください。これは空のファイルを作成する便利な方法です。

関連情報