Bisakah ',,' alias '..'?

41

Kadang-kadang ketika saya ingin mengubah ke direktori induk, saya keliru ketik cd ,,bukan cd ... Apakah ada cara saya bisa membuat bash menganggap pernyataan ini sama? Saya tidak pernah menggunakan koma dalam perintah saya. Idealnya, saya ingin alias ,,untuk ... Ketika saya mencoba ini, itu tidak berhasil. Mengapa ini tidak berhasil? Bagaimana lagi saya bisa mendekati masalah ini?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory
kilojoule
sumber
6
Alias ​​adalah program untuk dijalankan, bukan argumen untuk program; sehingga $ ,,akan mengeluh, seperti: bash: ..: Is a directory. (Dengan kata lain, ini bukan eksekusi.)
jpaugh
5
@ jpaugh: Cara yang lebih jelas untuk mengatakan bahwa: ekspansi alias hanya terjadi pada "kata" pertama dari suatu perintah. Jadi seperti yang Anda katakan, ini hanya berfungsi untuk nama perintah, bukan args. (Dan Anda bahkan tidak bisa alias 'cd ,,'='cd ..'. Yah, Anda bisa, tetapi Anda harus menjalankannya cd\ ,,untuk menjadikannya satu kata.)
Peter Cordes
5
Pertimbangkan zsh. Ini memiliki alias global, jadi alias -g ,,=..dan cd ,,berfungsi seperti yang Anda harapkan.
muru
1
Berpikir lateral: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight
2
Imho: jangan lakukan ini. Menggunakan alias untuk menutupi kesalahan tipografi adalah praktik yang buruk. Kesalahan-kesalahan itu bisa berakhir pada kode atau screencasts yang disalin. Itu tidak akan berfungsi di host atau akun lain. Dan modifikasi semacam itu (tergantung pada bagaimana penerapannya) dapat menyebabkan kesalahan lain, tidak terduga, sulit di-debug. Saran saya: jika Anda salah mengetik perintah, cukup ketik lagi ;-).
jjmontes

Jawaban:

45

ZSH:

Jika Anda menggunakan zsh alias -g ,,=".."apa yang Anda butuhkan, tetapi ini akan menyebabkan ",," diperluas di mana-mana, tidak hanya saat digunakan bersama cd.

Dari man zshbuiltins:

Jika ada -g bendera, tentukan alias global; alias global diperluas bahkan jika itu tidak terjadi pada posisi perintah.

PESTA:

Jika dibatasi bash(karena pertanyaan ditandai dengan ), baca yang berikut ini:

Ini adalah solusi alias murni, seperti yang diminta, namun ini akan melakukan lebih dari yang diperlukan yang mungkin membuat frustasi pengguna (lihat peringatan di akhir posting saya).

Mengutip man bash:

Jika karakter terakhir dari nilai alias adalah kosong, maka kata perintah berikutnya setelah alias juga diperiksa untuk ekspansi alias.

Karena itu cukup untuk alias cddengan ruang tambahan (untuk memungkinkan perluasan argumen berikutnya) dan kemudian alias ,,ke ... Lihat itu

alias cd='cd '
alias ,,='..'

memberikan apa yang Anda butuhkan.

Perhatikan bahwa ini benar tidak hanya untuk bash(dan aliasimplementasinya), tetapi semua shell kompilasi POSIX. Mengutip contoh dari man 1p alias(manual tidak menggambarkan fitur ini secara eksplisit, hanya melalui contoh):

  1. Atur nohup agar dapat menangani argumen yang merupakan nama alias:

           alias nohup="nohup "

Peringatan: Ketika @PeterCordes menulis dalam komentarnya, ini akan secara otomatis menyebabkan alias lain ketika ditulis setelahnya cd. Mungkin mengharuskan Anda untuk menulis cd \grepjika Anda ingin mengubah direktori ke satu bernama greptetapi Anda grepadalah alias untuk grep --color=auto. Tanpa backslash, cdakan melaporkan kesalahan "terlalu banyak argumen" (Anda tidak bisa cdke dua direktori sekaligus) !.

styrofoam terbang
sumber
22
Itu hack cerdas tapi jahat. Saya tidak ingin melakukan itu; terlalu mudah untuk itu menggigit Anda secara tidak sengaja. misalnya jika Anda memiliki alias untuk perintah yang biasa Anda jalankan, dan Anda ingin cdmasuk ke direktori kode sumbernya. Atau tabrakan lain antara alias Anda dan nama direktori umum. Seperti cd drakan berkembang cd disown -runtuk saya, dengan alias ini. Pokoknya, jauh lebih baik untuk menimpa builtin cddengan fungsi untuk hal-hal seperti ini, IMO.
Peter Cordes
8
+1 untuk solusi alias murni (saya belajar sesuatu). Pada saat yang sama saya setuju dengan komentar Peter. Beberapa jenis peringatan eksplisit harus ditambahkan pada jawaban Anda, saya kira.
Kamil Maciorowski
58

Alias ​​tidak dimaksudkan untuk melakukan ini, tetapi Anda dapat membuat fungsi yang disebut cdpembungkus untuk yang asli cd. Yang ini bekerja untuk saya! Masukkan saja ke dalam .bash_profilefile profil pilihan Anda atau Anda.

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

Atau, dengan komentar dan pemformatan yang cantik:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

EDIT

Terima kasih @derobert untuk menunjukkan bahwa if then elseini lebih baik daripada di sini && ||. Juga, saya baru menyadari ( * facepalm *) bahwa implementasi ini hanya akan berfungsi jika ada argumen non-path (yaitu -L -P) bukan argumen pertama. Jadi berhati-hatilah, jika Anda memiliki kebiasaan mengetik yang buruk, cd -L ,,ini tidak akan membantu Anda. Dan itu tidak mudah untuk ditangani dengan benar, saya pikir.

BenjiWiebe
sumber
16
@ BenjiWiebe Saya pikir versi "komentar dan format cantik" akan lebih baik dengan if-then-else.
zwol
Wah, banyak ide bagus. Saya melihat Anda menggunakan fitur edit untuk menangani perbaikan yang diperlukan. Saya tidak menghabiskan banyak waktu untuk mengujinya. :)
BenjiWiebe
1
Atau, cukup timpa $1sebelum menjalankan built-in:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight
1
@ TorySpeight set .. "${@:2}", atau Anda kehilangan apa pun setelah argumen pertama.
chepner
8
Juga, secara teknis ..tidak harus menjadi argumen pertama; cddi bashdapat mengambil berbagai pilihan ( -P, -L, -@, -e).
chepner
29

Alias ​​harus menjadi kata pertama dari suatu perintah. Juga, alias harus diganti dengan kata karena itu tidak ada spasi).

Manual Referensi Bash: Alias

Alias ​​memungkinkan string untuk menggantikan kata ketika digunakan sebagai kata pertama dari perintah sederhana.

Anda bisa alias keduanya ..dan ,,menjadi cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/
Steven
sumber
Itulah tepatnya yang saya lakukan! : D dua titik / koma ini lebih mudah cd ..
diketik
10
+1, itu bukan ide yang buruk sama sekali. Cara lain untuk melakukannya .. di Bash adalah dengan shopt -s autocdyang memungkinkan Anda mengubah ke direktori apa pun hanya dengan memasukkan namanya. Tentu saja Anda masih alias untuk,,
ilkkachu
Saya juga :-)
joeytwiddle
3

Cara lain untuk melakukan ..perubahan direktori adalah mengaktifkan autocd fitur Bash :

shopt -s autocd 

Itu akan secara otomatis mengubah direktori ketika Anda memasukkan nama:

~$ /tmp
cd /tmp
/tmp$ 

Anda masih harus membuat alias untuk ,,tetapi itu bisa dilakukan dengan adilalias ,,=..

ilkkachu
sumber
2

Sudah ada skrip aplikasi untuk itu: https://github.com/shyiko/commacd (tidak ada afiliasi dengan Stanley Shuyiko).

commacdmengekspor tiga perintah: ,(untuk melompat maju), ,,(mundur) dan ,,,(mundur + maju):

Mereka bertiga mencoba mencocokkan dengan awalan terlebih dahulu. Hanya jika tidak ada hasil yang ditemukan, mereka akan mundur ke pencocokan substring (fuzzy)

Untuk menjawab pertanyaan Anda, skrip alias koma ke tiga fungsi yang didefinisikan:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
Dokter Dao
sumber