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;date2つのパイプラインに分割されます。
1. time
2. datetimeコマンドがないため、パイプライン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/timebashのエラーではなく、エラーであることに注意してください。
バックティックが機能する理由は、バックティックがtimeパイプライン内の特別な要素として解釈されなくなるためです。
つまり、バックティック付き:
`time`;date2つのパイプラインとして解析されます。
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;datevsにあり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]