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
, ksh
Dan bash
berperilaku sama. Setidaknya untuk csh
itu 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?
Jawaban:
Sintaks alias yang Anda gunakan tidak pantas untuk shell POSIX, untuk shell POSIX, Anda perlu menggunakan:
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.
sumber
yash
atauzsh
tidak akan memperluas alias dishell -c 'alias name=replacement<newline>replacement'
. Untuk AT&Tksh
, Anda akan memiliki masalah dengan skrip bersumber .=
yang digunakan dalamalias
sintaks.=
. itu karena ekspansi alias terjadi ketika shell pertama kali melihat baris, yang sebelum Anda menentukan alias.zsh/yash -c 'code'
manacode
diuraikan secara keseluruhan. Tampaknya tidak demikian halnya dengan cangkang Bourne. Jadi saya kira shell Bourne mem-parsing bahwacode
ada satu baris pada suatu waktu.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>
, perintahalias
itu tidak dijalankan.sumber