以降、新しいエイリアスは使用できません。


9

今までは、シェルのセミコロンは(どういうわけか)改行と同じ意味だと思っていました。だから私はそれに驚いた

alias <name>=<replacement text>; <name>

<name>次の行で知られていますが、不明です。cshtcshshkshbash同じように動作。少なくともcshエイリアスが直接使用されているか、スクリプトがsemccolonの前に供給されているかは問題ではありません。エイリアスは後ではわかりません;が、次のコマンドラインではわかります。これはバグですか、それとも意図された動作ですか?


「シェルのセミコロンは(どういうわけか)改行と同じ意味だと思った」ほぼ。だめ!
オービットのライトネスレース

1
セミコロンと改行の解釈は、パーサーの呼び出し方法によって異なります。「ドット」コマンドの場合、ボーンシェルは「NLFLG」を使用してパーサーを呼び出し、特定の状況で改行とセミコロンを等しいものとして扱うように指示しますが、他の場合はそうではありません。一般に、セミコロンは構文エラーの原因となる改行を含む可能性があるため、セミコロンと改行は同等ではありません。
2015年

回答:


9

使用しているエイリアス構文はPOSIXシェルには不適切です。POSIXシェルの場合、次を使用する必要があります。

alias name='replacement'

しかし、すべてのシェルで、エイリアスの置換はパーサーの早い段階で行われるため、これは機能しません。

エイリアスのセットアップが実行される前に、パーサーによって行全体が読み取られたため、コマンドラインは機能しません。

エイリアスが次のコマンドラインに表示される場合、機能します。


また、一部のシェルが好きyashzshで別名を拡張しませんshell -c 'alias name=replacement<newline>replacement'。AT&Tのksh場合、ソーススクリプトに問題があります。
ステファンChazelas

この場合はcshを使用する必要があります- 構文で=は使用されていませんalias
user3224237 2015年

@ user3224237-これはとは関係ありません=。これは、エイリアスを定義するに、シェルが最初に行を見つけたときにエイリアスの展開が行われるためです。
cas

@StéphaneChazelas「ソース」スクリプトの動作は、Bourneシェルが実行される前にそのようなファイルを完全に解析することが原因です。KshはBourne Shellソースに基づいており、変更されていないものはすべて同じように動作します。
schily 2015年

@schily、はい、それはzsh/yash -c 'code'where codeが全体として解析されるのと同じ理由です。Bourneシェルの場合はそうではないようです。したがって、Bourneシェルcodeが一度に1行ずつ解析するとします。
ステファンChazelas

5

この動作は、POSIXのAlias Substitutionの下で意図され、指定されています。

エイリアスは、シェルがトークン認識を実行した直後で、文法規則が適用される前に置き換えられました。エイリアスを呼び出したとき<name>、コマンドaliasは実行されませんでした。

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