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

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

これまで、シェルのセミコロンが改行文字と同じ意味を持っていると思いました。だから私は驚きました。

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

<name>不明ですが、次の行は知られています。csh、、、、tcshおよび同様に動作しshますkshbash少なくともcshエイリアスを直接使用したり、セミコロンの前にスクリプトをインポートしたりすることは重要ではありません。エイリアスはセミコロンの後にはわかりませんが、;次のコマンドラインからはわかります。これはバグですか、それとも意図的な動作ですか?

答え1

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

alias name='replacement'

ただし、すべてのシェルに対して、別名の置換がパーサーの最初に実行されるため、これは機能しません。

パーサーはエイリアス設定を実行する前に行全体を読み取るため、コマンドラインは機能しません。

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

答え2

この動作は意図的であり、POSIX によって指定されます。エイリアスの置換

エイリアスはシェルの実行後すぐに置き換えられます。トークン認識そして何よりも先に文法規則アプリケーション。 aliasを呼び出すと、<name>コマンドはaliasまだ実行されていません。

答え3

本当に欲しいなら一行、それでできますエイリアスの代わりに関数を使用する

たとえば、py3別名を生成しましたが、これは2行目でのみ有効です。

$ alias py3=python3; py3 -c 'print("hello, world")'

Command 'py3' not found, did you mean:

  command 'py' from deb pythonpy
  command 'hy3' from deb python3-hy
  command 'pyp' from deb pyp

Try: sudo apt install <deb name>

$ py3 -c 'print("hello, world")'
hello, world

代わりに、次py3のように定義できます。functionalias

$ function py3() { python3 "$@"; }; py3 -c 'print("hello, world")'
hello, world

またはexport -f後でサブプロセスで使用する前に:

$ function py3() { python3 "$@"; }; export -f py3; bash -c "py3 -c 'print("'"hello, world"'")'"
hello, world

違いを悟ったら変数とエイリアス/関数、その後利用できます変えるまた:

$ py3='python3'; $py3 -c 'print("hello, world")'
hello, world

不要export -f

$ py3='python3'; bash -c "$py3 -c 'print("'"hello, world"'")'"
hello, world

関連情報