Alias ​​baru tidak tersedia setelah;

9

Sampai sekarang saya berpikir bahwa tanda titik koma di shell memiliki (entah bagaimana) arti yang sama dengan pemutusan garis. Jadi saya terkejut untuk itu

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

<name>tidak diketahui saat dikenal di baris berikutnya. csh, tcsh, sh, kshDan bashberperilaku sama. Setidaknya untuk cshitu tidak masalah apakah alias digunakan secara langsung atau jika skrip bersumber sebelum semccolon - alias tidak diketahui setelah ;tetapi dikenal di baris perintah berikutnya. Apakah ini bug atau apakah perilaku ini dimaksudkan?

pengguna3224237
sumber
"Saya berpikir bahwa tanda titik koma di shell memiliki (entah bagaimana) arti yang sama dengan pemutusan baris" Hampir. Tidak terlalu!
Lightness Races in Orbit
1
Interpretasi titik koma dan baris baru tergantung pada bagaimana parser dipanggil. Untuk perintah "dot", Bourne Shell memanggil parser dengan "NLFLG" yang memberitahukannya untuk memperlakukan baris baru dan titik koma sama dalam beberapa situasi, tetapi ini tidak terjadi di tempat lain. Secara umum, titik koma dan linebreak tidak sama dengan Anda dapat memiliki linebreak, di mana titik koma akan menyebabkan kesalahan sintaksis.
schily

Jawaban:

9

Sintaks alias yang Anda gunakan tidak pantas untuk shell POSIX, untuk shell POSIX, Anda perlu menggunakan:

alias name='replacement'

Tetapi untuk semua shell, ini tidak bisa berfungsi karena penggantian alias dilakukan di awal parser.

Sebelum pengaturan alias Anda dijalankan, seluruh baris telah dibaca oleh parser dan karena alasan ini, baris perintah Anda tidak akan berfungsi.

Jika alias muncul di baris perintah berikutnya, itu akan berfungsi.

schily
sumber
Selain itu, beberapa cangkang suka yashatau zshtidak akan memperluas alias di shell -c 'alias name=replacement<newline>replacement'. Untuk AT&T ksh, Anda akan memiliki masalah dengan skrip bersumber .
Stéphane Chazelas
Saya perlu menggunakan csh dalam hal ini - tidak ada =yang digunakan dalam aliassintaks.
user3224237
@ user3224237 - ini tidak ada hubungannya dengan =. itu karena ekspansi alias terjadi ketika shell pertama kali melihat baris, yang sebelum Anda menentukan alias.
cas
@ Stéphane Chazelas Perilaku dengan skrip "bersumber" disebabkan oleh fakta bahwa shell Bourne sepenuhnya mem-parsing file-file seperti itu sebelum dieksekusi. Ksh didasarkan pada sumber Bourne Shell dan segala sesuatu yang tidak diubah berperilaku sama.
schily
@ untungnya, ya, itu alasan yang sama untuk di zsh/yash -c 'code'mana codediuraikan secara keseluruhan. Tampaknya tidak demikian halnya dengan cangkang Bourne. Jadi saya kira shell Bourne mem-parsing bahwa codeada satu baris pada suatu waktu.
Stéphane Chazelas
5

Perilaku ini dimaksudkan dan ditentukan oleh POSIX di bawah Pergantian Alias .

Alias ​​diganti tepat setelah shell melakukan Pengakuan Token dan sebelum Aturan Tata Bahasa diterapkan. Pada saat Anda memanggil alias <name>, perintah aliasitu tidak dijalankan.

cuonglm
sumber