Bisakah saya menggunakan cd ../ .. sebagai nama alias?

11

Saya menggunakan Windows dan Ubuntu secara paralel dan melakukan hal-hal konsol pada keduanya.

Di Windows saya bisa melakukan

C:\Users\Thomas>cd..\..
C:\>

Namun, di Linux ini tidak berfungsi, baik dengan backslash atau dengan garis miring.

21:17:10 $ cd../..
bash: cd../..: No such file or directory

Karena saya sering melakukan kesalahan itu, saya telah mencoba mendefinisikan alias .bash_aliasesuntuk situasi itu:

alias cd../..='cd ../..'
alias cd..\..='cd ../..'

Ketika saya memulai pesta baru, saya mengerti

21:16:26 $ bash
bash: alias: `cd../..': invalid alias name

Bagaimana cara saya mengatur alias untuk cd..\..dan cd../..dengan benar?

The cd..\..tampaknya memiliki masalah dengan karakter escape:

21:39:43 $ cd..\..
bash: cd....: command not found

Tidak berfungsi, meskipun saya mendefinisikan alias lain untuk cd.....

Thomas Weller
sumber
2
Kamu tidak bisa Perintah, alias, atau nama file tidak boleh mengandung /karakter. The \ versi, di sisi lain, harus bekerja dengan baik.
fkraiem
@ fkraiem: Sepertinya versi backslash memiliki masalah sebagai karakter pelarian. Memperbarui pertanyaan.
Thomas Weller
Oh, tentu saja. Dari man bash: Karakter /, $, `, dan = dan salah satu metakarakter shell atau mengutip karakter yang tercantum di atas mungkin tidak muncul dalam nama alias.
fkraiem
Sial. Saya mencoba man aliasdan itu tidak ada. Jika Anda memberikan itu sebagai jawaban, saya akan menerimanya.
Thomas Weller
Alias ​​adalah satu hal, fungsi shell adalah hal lain. Coba lihat lagi.
alexis

Jawaban:

10

/dan di \antara karakter yang tidak dapat muncul dalam nama alias Bash. Dari man bash:

Karakter /,, $`, dan =dan semua karakter meta shell atau mengutip karakter yang tercantum di atas mungkin tidak muncul dalam nama alias.

Sebagai solusinya, Anda dapat beralih ke Zsh, yang memungkinkan keduanya:

% grep 'alias.*cd' .zshrc 
alias cd../..='cd ../..'
alias cd..\\..='cd ../..'
% pwd
/Users/firas
% cd../..
% pwd
/ 
% cd
% pwd
/Users/firas
% cd..\..
% pwd
/
fkraiem
sumber
12

Anda tidak dapat menggunakan garis miring pada nama alias. Namun, Bash memungkinkan mereka dalam nama fungsi, sehingga Anda dapat membuatnya menjadi fungsi:

cd../.. () { cd ../..; }

Anda tidak dapat menggunakan garis miring terbalik dalam nama alias atau fungsi. Karakter backslash mengutip karakter berikutnya, jadi cd..\..diuraikan sebagai cd...., baik sebelum string itu dicari sebagai nama perintah. Jika Anda ingin memanggil perintah bernama cd..\.., Anda perlu mengetik cd..\\.., 'cd..\..'atau sesuatu yang setara. Selain itu, nama perintah yang dikutip dengan cara apa pun tidak dipertimbangkan untuk pencarian alias, jadi Anda tidak dapat menggunakan nama alias yang mengandung backslash. Bash juga tidak mengizinkan backslash dalam nama fungsi. Karena cd..\..diuraikan sebagai cd...., Anda dapat mendefinisikan fungsi yang disebut cd....(seperti di atas).

Jika Anda menggunakan cdperintah, Anda harus mengetik spasi setelahnya, sama seperti perintah lainnya. Tapi Anda bisa menyimpan pengetikan dengan tidak mengetik cdsama sekali. Tetapkan autocdopsi dengan baris berikut di ~/.bashrc:

shopt -s autocd

Kemudian Anda bisa mengetikkan nama direktori pada baris perintah, dan "mengeksekusi" direktori itu akan mengubahnya.

~/some/sub/directory$ ../..
~/some$ 
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Jika saya melakukan shopthal itu, saya mungkin akan segera kehilangan fungsi itu pada Windows :-)
Thomas Weller
Um, itu tidak benar. Garis miring diterima dalam nama fungsi bash.
alexis
@alexis Ah, benar, kamu bisa menggunakan garis miring di bash. Tetap, terima kasih.
Gilles 'SO- stop being evil'
@ Thomas. Tentu saja kamu akan. autocdadalah salah satu alasan saya beralih ke zsh, kembali ketika bash tidak memilikinya. Satu-satunya cara yang layak untuk menggunakan Windows adalah menginstal Cygwin, lengkap dengan zsh.
Gilles 'SO- stop being evil'
5

"Anda tidak dapat menggunakan garis miring dalam nama alias atau fungsi "? Itu berita baru bagi saya. Saya telah menggunakan fungsi shell berikut selama bertahun-tahun di Linux dan OS X bash, dan tidak pernah mengalami masalah:

function ../.. { cd ../..; echo "$PWD"; }

Tentu, cd../..adalah nama fungsi yang bagus juga. Slash dapat digunakan dalam nama fungsi shell.

Sedangkan untuk versi backslash, Anda tidak bisa menanamkannya dalam nama alias atau fungsi tetapi Anda tidak harus: Ketika Anda mengetik cd..\.., bash mengartikan backslash sebagai pelarian dan mencoba mengeksekusi hasilnya cd..... Jadi tentukan itu dan Anda bisa melakukan semua yang Anda kejar. Sama sama.

function cd.... { cd ../..; } 
Alexis
sumber
2

Jika Anda ingin menyimpan alias, mengapa tidak lakukan saja:

alias   ..='cd ..'
alias  ...='cd ../../' 
alias ....='cd ../../../'

Atau, jika Anda perlu untuk pergi jalan kembali:

alias   .3='cd ../../../' 
alias   .4='cd ../../../../'
alias   .5='cd ../../../../../'
# how far back do you need to go on a normal basis..?

Tidak tahu seberapa baik hal itu membantu Anda tetap sinkron secara mental dengan otak Windows Anda, tetapi ini masih tampak seperti cara yang mudah untuk dilakukan. (Setidaknya bagi kita yang cukup beruntung tidak perlu khawatir tentang bagaimana hal-hal dilakukan pada Windows.)

jon
sumber