Alias ​​dan fungsi

17

Dari manual bash

Aturan tentang definisi dan penggunaan alias agak membingungkan. Bash selalu membaca setidaknya satu jalur input lengkap sebelum menjalankan salah satu perintah di jalur itu. Alias ​​diperluas ketika perintah dibaca, bukan saat dijalankan. Oleh karena itu, definisi alias muncul pada baris yang sama dengan perintah lain tidak berlaku hingga baris input berikutnya dibaca. Perintah yang mengikuti definisi alias di baris itu tidak terpengaruh oleh alias baru. Perilaku ini juga merupakan masalah ketika fungsi dijalankan. Alias ​​diperluas ketika definisi fungsi dibaca, bukan ketika fungsi dieksekusi , karena definisi fungsi itu sendiri adalah perintah majemuk. Sebagai konsekuensi, alias yang didefinisikan dalam suatu fungsi tidak tersedia sampai setelah fungsi tersebut dieksekusi . Agar aman, selalu letakkan definisi alias pada baris yang terpisah, dan jangan gunakan alias dalam perintah majemuk.

Dua kalimat "Alias ​​diperluas ketika definisi fungsi dibaca, bukan ketika fungsi dieksekusi" dan "alias yang didefinisikan dalam fungsi tidak tersedia sampai setelah fungsi dijalankan" tampaknya bertentangan satu sama lain.

Bisakah Anda menjelaskan masing-masing artinya?

StackExchange untuk Semua
sumber
Pertanyaan bagus! Saya mencondongkan sesuatu yang baru hari ini. Saya belajar 2 hal, sebenarnya: 1) info ini tentang ekspansi alias pada saat fungsi def dibaca, dan 2) bahwa saya harus benar-benar membaca manual bash dengan seksama (yang saya pikir sudah saya lakukan, tetapi ternyata tidak ^^ )
Olivier Dulac
4
Pertanyaan utamanya adalah, haruskah orang menggunakan alias dalam mode noninteraktif? Untuk itulah fungsinya, dan alias hanya membuat skrip lebih rentan kesalahan. Sebenarnya saya tidak pernah membutuhkan info di atas, karena saya hanya pernah menemukan alias di .bashrcfile di bagian paling atas.
orion

Jawaban:

29
  1. Alias ​​diperluas ketika definisi fungsi dibaca, bukan ketika fungsi dieksekusi ...

    $ echo "Rubah cokelat cepat melompati anjing malas." > myfile
     
    $ alias myalias = cat
     
    $ myfunc () {
    > myalias myfile
    >}
     
    $ myfunc
    Rubah cokelat cepat melompati anjing malas.
     
    $ alias myalias = "ls -l"
     
    $ myalias myfile
    -rw-r - r-- 1 myusername mygroup 45 Des 13 07:07 myfile
     
    $ myfunc
    Rubah cokelat cepat melompati anjing malas.

    Meskipun myfuncsudah didefinisikan untuk memanggil myalias, dan saya telah mendefinisikan ulang myalias, myfuncmasih mengeksekusi definisi asli dari myalias. Karena alias diperluas ketika fungsi didefinisikan. Faktanya, shell tidak lagi mengingat myfuncpanggilan itu myalias; hanya tahu yang myfuncmemanggil cat:

    $ type myfunc
    myfunc adalah fungsi
    myfunc ()
    {
    kucing myfile
    }
  2. ... alias yang didefinisikan dalam suatu fungsi tidak tersedia sampai setelah fungsi tersebut dieksekusi.

    $ echo "Rubah cokelat cepat melompati anjing malas." > myfile
     
    $ myfunc () {
    > alias myalias = cat
    >}
     
    $ myalias myfile
    -bash: myalias: perintah tidak ditemukan
     
    $ myfunc
     
    $ myalias myfile
    Rubah cokelat cepat melompati anjing malas.

    The myaliasalias tidak tersedia sampai myfuncfungsi telah dieksekusi. (Saya percaya itu akan agak aneh jika mendefinisikan fungsi yang mendefinisikan alias sudah cukup untuk menyebabkan alias didefinisikan.)

G-Man Mengatakan 'Reinstate Monica'
sumber
4
+1, jawaban yang bagus. Sebuah "akibat wajar" penting untuk ini adalah bahwa jika seseorang berniat untuk mendefinisikan fungsi dan alias dalam naskah, lebih baik letakkan definisi alias sebelum definisi fungsi! (jelas, sekarang, diberikan jawabannya, tetapi saya tidak tahu ini).
Olivier Dulac
Terima kasih. Saya pikir masalah mendasar adalah perbedaan antara menjalankan definisi fungsi dan memanggil fungsi. Secara khusus, operasi shell apa yang dilakukan selama menjalankan definisi fungsi dan selama memanggil fungsi masing-masing? Apakah ada operasi shell yang dilakukan selama menjalankan definisi fungsi dan memanggil fungsi, atau menjalankan definisi fungsi dan memanggil fungsi menjalankan operasi shell yang tidak tumpang tindih?
StackExchange for All
Yah, ini sedikit seperti perbedaan antara membangun mobil dan mengendarai mobil. Atau membeli sandwich dan makan sandwich. Saya telah memberikan jawaban yang lebih rinci untuk pertanyaan Anda yang lain .
G-Man Mengatakan 'Reinstate Monica'
Terima kasih. Setelah membaca ulang kutipan dari manual bash dan balasan Anda, saya bingung tentang arti menjalankan fungsi. Apakah itu berarti menjalankan definisi suatu fungsi, atau memanggil suatu fungsi? Lihat unix.stackexchange.com/q/384209/674
StackExchange for All
1

Saya perlu jawaban yang dinyatakan oleh kalimat pertama ketika saya mencoba cuplikan di bawah ini di.bashrc .

alias ls='\ls -F --color=auto --show-control-chars'
alias ll='ls -ahl'
function lf_macro() {
    local CMD=${1:-ls} DIR=${2:-.};
    $CMD $(find $DIR -maxdepth 1 -type f);
}
function lf() { lf_macro ll "$1"; }
function lsf() { lf_macro ls "$1"; }     # list all file, no directories

setelah itu unalias -a; source ~/.bashrc, saya mencoba untuk mengeksekusi lfdan lsf,

$ lf
-bash: ll: command not found

$ lsf
./file1 ./file2 ./script.sh ...     # no color, no control-chars

$ ls $(find -maxdepth 1 -type f)
./file1 ./file2 ./script.sh* ...

tampak jelas bahwa alias diperluas pada definisi fungsi, bukan eksekusi fungsi, karena :

  • ketika saya mengeksekusi lf, kesalahan -bash: ll: command not found, dan
  • ketika saya mengeksekusi lsf, /usr/bin/lsdigunakan, bukan bentuk alias, tidak ada highlight warna, dan tidak ada karakter kontrol setelah file yang dapat dieksekusi.
qeatzy
sumber