これまで、シェルのセミコロンが改行文字と同じ意味を持っていると思いました。だから私は驚きました。
alias <name>=<replacement text>; <name>
<name>
不明ですが、次の行は知られています。csh
、、、、tcsh
および同様に動作しsh
ますksh
。bash
少なくともcsh
エイリアスを直接使用したり、セミコロンの前にスクリプトをインポートしたりすることは重要ではありません。エイリアスはセミコロンの後にはわかりませんが、;
次のコマンドラインからはわかります。これはバグですか、それとも意図的な動作ですか?
答え1
使用しているエイリアス構文は、POSIXシェルには適していません。 POSIX シェルの場合は、以下を使用する必要があります。
alias name='replacement'
ただし、すべてのシェルに対して、別名の置換がパーサーの最初に実行されるため、これは機能しません。
パーサーはエイリアス設定を実行する前に行全体を読み取るため、コマンドラインは機能しません。
エイリアスが次のコマンドラインに表示されると機能します。
答え2
答え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
のように定義できます。function
alias
$ 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