Bash: Spasi dalam nama alias

117

Saya mencoba membuat alias di bash. Yang ingin saya lakukan adalah memetakan ls -lakels -la | more

Dalam file .bashrc saya inilah yang saya coba:

alias 'ls -la'='ls -la | more'

Namun itu tidak berfungsi karena (saya berasumsi) ini memiliki spasi dalam nama alias. Apakah ada solusi untuk ini?

sixtyfootersdude
sumber
8
Kenapa tidakalias lsm='ls -la | more'
Nifle

Jawaban:

126

The dokumentasi Bash negara "Untuk hampir setiap tujuan, fungsi shell lebih disukai daripada alias." Berikut adalah fungsi shell yang menggantikan lsdan menyebabkan output untuk disalurkan ke morejika argumen terdiri dari (hanya) -la.

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

Sebagai one-liner:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Output pipa secara otomatis:

ls -la
Dennis Williamson
sumber
1
mengapa Anda perlu menggunakan tanda kurung ganda di dalam pernyataan if?
sixtyfootersdude
1
@sixtyfootersdude: Bentuk braket ganda lebih kuat dan saya menggunakannya karena kebiasaan. Lihat mywiki.wooledge.org/BashFAQ/031
Dennis Williamson
Jadi apa perintah terakhir? alias ls = 'ls ()' ??
Astaga
1
@ Jeef: Tidak, jawaban saya menggunakan fungsi alih - alih alias. Saya telah mengeditnya untuk membuatnya lebih jelas.
Dennis Williamson
6
@merlinpatt: commandmencegah fungsi dipanggil secara rekursif.
Dennis Williamson
53

Dari halaman manual alias :

Kata pertama dari setiap perintah sederhana, jika tidak dikutip, diperiksa untuk melihat apakah ada alias. Jika demikian, kata itu diganti dengan teks alias. Nama alias dan teks pengganti mungkin mengandung input shell yang valid, termasuk karakter meta shell, dengan pengecualian bahwa nama alias mungkin tidak mengandung `= '.

Jadi, hanya kata pertama yang diperiksa untuk kecocokan alias yang membuat alias multi-kata menjadi tidak mungkin. Anda mungkin dapat menulis skrip shell yang memeriksa argumen dan memanggil perintah Anda jika cocok dan sebaliknya hanya memanggil yang normal ls(Lihat jawaban @Dennis Williamson )

astaga
sumber
8
+1 Untuk menjelaskan mengapa saya tidak diizinkan menggunakan ls -la sebagai alias.
sixtyfootersdude
7
Ini bermanfaat karena alih-alih mencoba menyelesaikannya justru menjawab pertanyaan. Saya datang ke sini karena saya ingin membuat alias dengan spasi di dalamnya dan itu tidak akan terjadi.
angryundead
Ini tidak hanya menjawab pertanyaan saya, tetapi memberi saya wawasan berharga tentang bagaimana sebenarnya mekanisme aliasing bekerja. Kutipan Anda dari halaman manual cukup membantu.
Lily Finley
14

Pendekatan yang sedikit lebih baik diambil dari jawaban Dennis:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

Atau satu-baris:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

Ini memungkinkan untuk opsi / argumen lebih lanjut ditambahkan setelah perintah jika diperlukan, misalnya ls -la -h

ld_pvl
sumber
2
Bagaimana ini menangani jika saya ingin ls -latdikecualikan dari perawatan ini? Saya perlu meletakkan kasing untuk menanganinya di atas -la*entri, ya?
Steven Lu
-1

Anda masih dapat menggunakan alias ini, tetapi Anda perlu mengutip agar ruang tersebut merupakan bagian dari kata perintah. Jadi "ls -la" -p patternakan melewati -p patternopsi untuk more, bukan ls.

Charles Stewart
sumber