bashシェルに関して理解できない不整合があるようです。
私が実行すると:
ls;date;time
3つのクエリの結果が順番に表示されます。
ただし、日付と時刻の位置を交換すると、エラーメッセージがポップアップ表示されます。
だから私が実行すると:
ls;time;date
エラーメッセージは言う:bash: syntax error near unexpected token 'date'
。
誰かがこれを説明できますか?
bashシェルに関して理解できない不整合があるようです。
私が実行すると:
ls;date;time
3つのクエリの結果が順番に表示されます。
ただし、日付と時刻の位置を交換すると、エラーメッセージがポップアップ表示されます。
だから私が実行すると:
ls;time;date
エラーメッセージは言う:bash: syntax error near unexpected token 'date'
。
誰かがこれを説明できますか?
回答:
time
パイプラインのコマンドは/usr/bin/time
バイナリではなく、bashのtime
組み込みです。と比較man time
してくださいhelp time
。表示されるエラーは、bashがtime
の引数を解析できないことです。これは存在するか、改行でなければなりません。最初の例では改行ですが、2番目の例にはありません。
一方、実行する場合
ls;date;'time'
または
ls;'time';date
周りの引用符'time'
が予約語としてのステータスを取り消す場合、bashは行の解析に問題はありません。これは、リスト内の3つのコマンドを解析し、順番に実行し/usr/bin/time
、どちらの場合も使用エラーを報告します。
補遺
time ; date
エラーが発生しても発生time ; ; date
しません。考えられる説明は、time ;
bashによってと同等であると解釈されることtime <newline>
です。次に、式time ; ; date
はtime ;
and のリストとして解析されdate
ます。
これは、という観察と一致しているtime ;
とtime ; ;
も合法である、第二ビーイングを含むシングルトンリストとして解析time ;
リストの後に許可任意のセミコロンが続きます。
したがってtime ; date
、エラーbash: syntax error near unexpected token 'date'
が発生する理由を説明するもう1つの方法は、time
それをから分離するセミコロンを消費することですdate
。time
はbashの予約語であるため、それだけが可能です。
time
ます。NULLコマンドを許可することになっており、セミコロンはリストを区切ることになっているため、time
コマンドの後にIMO がセミコロンを「消費」してはなりません。他の組み込みコマンド(引数を取ることができる)は、この種の動作を示しません。
time;date
、実際の解釈は構文的に間違っています。ただし time ;
、time ; ;
その場合も違法になります。time
の動作がバグなのか、それとも単に文書化されていないのか(内部的に一貫している)は議論の余地がありますが、バグレポートは間違いなく適切に配置されます。提出してもよろしいですか?
time by itself can time a null command
ていて、によってそうしてい$$ = make_simple_command (x, (COMMAND *)NULL);
ます。バグを提出するためとして、私は8)がわからない
time ; date
に作品をksh93
してmksh
も、中にかかわらず、エラーなしでksh
そこのtime
キーワード。
time
コマンドラインを解析するとき、bashは組み込みを特別なケースとして扱います。
bashのマンページで読み取れるように、入力した行は最初にリストに分割されます。
pipeline ; pipeline
パイプラインは次のとおりです。
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
または、私たちの場合、単に:
time command
つまり、時間が存在する場合、コマンドも存在する必要があります。
[ time
改行を続けることができる特殊なケースがありますが、ここでは適用されません]
したがって、この場合、次のようになります。
time;date
2つのパイプラインに分割されます。
1. time
2. date
time
コマンドがないため、パイプライン1は適切に形成されていません。したがってエラー。
コマンドラインtime
もここでは機能しないことに注意してください:
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bashはこれを期待どおりに2つのパイプラインに解析します。
1. /usr/bin/time
2. date
そして/usr/bin/time
、引数なしで実行することを拒否します。これは/usr/bin/time
bashのエラーではなく、エラーであることに注意してください。
バックティックが機能する理由は、バックティックがtime
パイプライン内の特別な要素として解釈されなくなるためです。
つまり、バックティック付き:
`time`;date
2つのパイプラインとして解析されます。
1. `time`
2. date
私たちの場合、パイプラインは次のとおりです:
[time] command
問題は当初time
、許可されていないコマンドがないことでした。しかし今、私たちは単にコマンドを持っています:
`time`
前time
にがない場合、バックティックはtime
、前の単語としてではなく、コマンドとして解釈されることを意味します。
そのため、bashはそのtime
引数を引数なしで実行しますが、これは受け入れられます。出力は生成されず、エラーも発生しません。
ご了承ください:
`time`
組み込みの結果を実際に実行time
します。つまり、time
組み込みがstdoutで生成するものは何でも実行します。しかし、time
それ自体ではstdoutに何も書き込まないため、動作するように見えます。
最後に、これが機能することが指摘されています:
time ; ; date
残念ながら説明できません:)
;date
与えるがbash: syntax error near unexpected token ;
、time ;date
与えるbash: syntax error near unexpected token date
ので、bashは組み込みの時刻以降のコマンドを「;日付」として処理しないようです。興味深いことに、time ; ; date
動作します。
'time'
それを予約語としてその意味を失います。これをバックティックすると、出力がコマンドにスプライスされるサブシェルで実行されます。これは議論とは何の関係もありません。実際のところ、あなたの例`time\';date
はあなたの主張に反していることを証明します:これは/usr/bin/time
議論を必要とするので、これはあなたの推論によってエラーを与えるはずです。それが実行されない理由は、それが実行されるサブシェルではtime
再び予約語であるためです。
time;date
vsにありdate;time
ます。これは、パイプライン入力bash
とtime
出力で生成された最後の文字に問題があるようです。別の端末エミュレータでテストした結果は以下のとおりです。 - [バッシュ] $日付、時刻#[OK] $時間、日付#[ NOTOK ] bashの:$時間# '予期しないトークン`日付の近くに構文エラーのみエラーは、それがあることを表示されません。任意の日付の結果。-[Csh] $ date; time#[OK] $ time; date#[OK]-[Tcsh] $ date; time#[OK] $ time; date#[OK]-[Ksh] $ date; time#[ OK] $ time; date#[OK]