perhatikan perintah alias ekspansi

67

Jika menjalankan watchperintah yang berisi alias, itu tidak akan memperluas alias. Saya sudah mencoba keduanya dengan kutip tunggal dan ganda, bahkan diberikan alias berikut:

# alias ll
alias ll='ls -l --color=tty'

Perintah berikut akan gagal

# watch ll
sh: ll: command not found

Tidakkah seharusnya ekspansi baris perintah berfungsi dalam kasus ini?

ztank1013
sumber

Jawaban:

98

Alias ​​hanya diperluas sebagai argumen pertama, atau setelah alias lain dengan spasi tambahan di akhir perintah.

Dari bash's help alias:

Ruang tambahan di VALUE menyebabkan kata berikutnya diperiksa untuk substitusi alias ketika alias diperluas.

Untuk melakukan ini, coba yang berikut ini:

alias watch='watch '
alias ll='ls -l --color=tty'
watch ll

Ingatlah bahwa beberapa versi watchwarna strip secara default, pada beberapa versi ini dapat dihentikan dengan menggunakan --coloratau -G.

Chris Down
sumber
1
Ini jawaban yang benar-benar luar biasa! Terima kasih dan +1 tentu saja.
ztank1013
1
Terima kasih ... Selama ini, saya dulu 1. mengetikkan ll, 2. tekan ctrl + alt + e, 3. lalu awalan menonton. Ini adalah penghemat waktu.
anishsane
10
Sayangnya metode ini memiliki batasan bahwa Anda tidak dapat memberikan opsi watchkarena alias harus menjadi kata berikutnya, sedangkan watchmemerlukan argumennya sebelum perintah dijalankan. Jika Anda mencoba watch -n 10 <alias>, bash tidak akan memperluas alias. Untuk mengatasinya, Anda memerlukan alias yang menyertakan opsi yang Anda inginkan (misalnya, `alias watch-10 = 'watch -n 10'), masih dengan spasi tambahan.
indiv
2

Mungkin kita bisa memperluas alias secara manual sebelum arloji melihatnya?

watch $(alias ll | cut -d\' -f2)

Penjelasan

Output dari alias llterlihat seperti:

$ alias ll
alias ll='ls -lAGh'

Jadi kami menetapkan delimeter potong menjadi kutipan tunggal, dan memotong bidang ke-2, meninggalkan:

ls -lAGh

yaitu alias yang diperluas. Itu kemudian membentuk argumen yang diberikan kepada watch.

Buat fungsi untuk melakukannya

function watcha {
    watch $(alias "$@" | cut -d\' -f2)
}

Kemudian,

watcha ll

bekerja seperti yang diinginkan. Ini mengerikan dan akan gagal dalam segala situasi. Maaf.

Jonathan Hartley
sumber
0

Saya pikir di sini masalah dasarnya adalah ketika mengeksekusi watch, argumen diberikan ke " sh -c" yang berarti jika alias lltidak didefinisikan dalam sh(dash shell's)lingkungan maka tidak akan memperluasnya. Tapi saya salah dan ini bukan masalahnya, jawaban Chris di atas benar.

Sachin Divekar
sumber
2
Tidak persis. Coba watch 'alias ll="ls -l --color=tty"; type ll; ll'.
Chris Down
+1 untuk tanggapan segera untuk memverifikasinya. Saya salah di atas.
Sachin Divekar
@ChrisDown, jadi meskipun jam tangan menggunakan " sh -c" penjelasan Anda juga berlaku sh. Apakah saya benar?
Sachin Divekar
1
Itu tergantung pada apa shell yang digunakan sh. Perhatikan bahwa ini tidak bekerja:sh -c $'alias ll="ls -l --color=tty"\ntype ll\nll'
Chris Bawah
0

Telah watchmenjalankan shell interaktif baru, yang akan memperluas alias:

watch -x bash -i -c ll

(Ini -xdimaksudkan untuk berhenti watchmenggunakan itu sendiri sh -cuntuk membungkus perintah yang diberikan. Kami tidak ingin itu karena kami harus meneruskan -ike shatau bash, untuk menjadikannya shell interaktif, yang bertuliskan .bashrc dan mendefinisikan alias. Dengan -x, arloji mengeksekusi perintah menggunakan exec.)

Gah, sebenarnya, ini tidak berhasil. Setelah menampilkan output 'll' satu kali, lalu tidur 2 detik, pekerjaan menjadi latar belakang, dengan sedikit membingungkan:

1]+  Stopped                 watch -x bash -i -c ll

Mengapa itu berhenti? Di mana brace terbuka [pergi? Sial saya pikir ini akan menjadi jawaban yang bagus tetapi saya tidak bisa membuatnya bekerja.

Jonathan Hartley
sumber