これらのbashコマンドの実行でシーケンスが重要なのはなぜですか?


10

bashシェルに関して理解できない不整合があるようです。

私が実行すると:

ls;date;time

3つのクエリの結果が順番に表示されます。

ただし、日付と時刻の位置を交換すると、エラーメッセージがポップアップ表示されます。

だから私が実行すると:

ls;time;date

エラーメッセージは言う:bash: syntax error near unexpected token 'date'

誰かがこれを説明できますか?


あなたの問題はtime;datevsにありdate;timeます。これは、パイプライン入力bashtime出力で生成された最後の文字に問題があるようです。別の端末エミュレータでテストした結果は以下のとおりです。 - [バッシュ] $日付、時刻#[OK] $時間、日付#[ NOTOK ] bashの:$時間# '予期しないトークン`日付の近くに構文エラーのみエラーは、それがあることを表示されません。任意の日付の結果。-[Csh] $ date; time#[OK] $ time; date#[OK]-[Tcsh] $ date; time#[OK] $ time; date#[OK]-[Ksh] $ date; time#[ OK] $ time; date#[OK]
モスタファシャーヴェルディ2013年

エラーメッセージの説明で回答を更新しました。これがあなたが探していた答えであることを確認してください。
zwets 2013年

回答:


10

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 ; ; datetime ;and のリストとして解析されdateます。

これは、という観察と一致しているtime ;time ; ;も合法である、第二ビーイングを含むシングルトンリストとして解析time ;リストの後に許可任意のセミコロンが続きます。

したがってtime ; date、エラーbash: syntax error near unexpected token 'date'が発生する理由を説明するもう1つの方法は、timeそれをから分離するセミコロンを消費することですdatetimeはbashの予約語であるため、それだけが可能です。


素敵な説明ありがとうございます!しかし、この場合も、この動作はバグのように見えtimeます。NULLコマンドを許可することになっており、セミコロンはリストを区切ることになっているため、timeコマンドの後にIMO がセミコロンを「消費」してはなりません。他の組み込みコマンド(引数を取ることができる)は、この種の動作を示しません。
2013年

@arrange複雑なのは、時間によってヌルコマンドが許可されないため(すべてを明確化することになる)、コマンドの代わりに改行しか許可されないことです。そのためtime;date、実際の解釈は構文的に間違っています。ただし time ;time ; ;その場合も違法になります。timeの動作がバグなのか、それとも単に文書化されていないのか(内部的に一貫している)議論の余地がありますが、バグレポートは間違いなく適切に配置されます。提出してもよろしいですか?
zwets 2013年

さて、私はソース(bash4.2:parse.y:lines 1205-1221)を確認しましたが、そこにはそのように書かれtime by itself can time a null commandていて、によってそうしてい$$ = make_simple_command (x, (COMMAND *)NULL);ます。バグを提出するためとして、私は8)がわからない
アレンジ

この問題はbash固有であることに注意してください。こうtime ; dateに作品をksh93してmkshも、中にかかわらず、エラーなしでksh そこのtimeキーワード。
Sergiy Kolodyazhnyy 2017

2

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/timebashのエラーではなく、エラーであることに注意してください。

バックティックが機能する理由は、バックティックが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動作します。
2013年

うん、ありがとう@arrange、それはかなり奇妙です。答えを少し更新します。
cdmackay 2013年

OK、@ arrange、書き直しました。それでもあなたの最後を説明することはできません...ため息。
cdmackay 2013年

@cdmackayバッククォートと引用符を混同しています。引用 'time'それを予約語としてその意味を失います。これをバックティックすると、出力がコマンドにスプライスされるサブシェルで実行されます。これは議論とは何の関係もありません。実際のところ、あなたの例`time\';dateはあなたの主張に反していることを証明します:これ/usr/bin/time議論を必要とするので、これあなたの推論によってエラー与えるはずです。それが実行されない理由は、それが実行されるサブシェルではtime再び予約語であるためです。
zwets 2013年

@arrangeどちらも構文エラーであり、どちらも同じ場所の近くにあると報告されているため、そこに不整合は見られません。構文エラーの領域に入ると、パーサーがその方法を知ることは期待できません。パーサーの構文が必要な場合は、正当な構文だけでなく、考えられるすべての不正な構文の構文も知っている必要があります。これは、定義上は不可能です。
zwets 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.