Bagaimana cara membuat “alias” untuk jalur yang panjang?

95

Saya mencoba membuat "alias" untuk jalur yang sering saya gunakan saat skrip shell. Saya mencoba sesuatu, tetapi gagal:

myFold="~/Files/Scripts/Main"
cd myFold

bash: cd: myFold: No such file or directory

Bagaimana cara membuatnya bekerja?
Namun, cd ~/Files/Scripts/Mainberhasil.

bashboy
sumber

Jawaban:

121

Karena ini adalah variabel lingkungan (alias memiliki definisi berbeda bash), Anda perlu mengevaluasinya dengan sesuatu seperti:

cd "${myFold}"

atau:

cp "${myFold}/someFile" /somewhere/else

Tetapi saya sebenarnya merasa lebih mudah, jika Anda hanya ingin kemudahan beralih ke direktori itu, untuk membuat alias nyata (di salah satu bashfile startup seperti .bashrc), jadi saya bisa menyimpan penekanan tombol:

alias myfold='cd ~/Files/Scripts/Main'

Maka Anda bisa menggunakan (tanpa cd):

myfold

Untuk menghilangkan definisi tersebut, Anda menggunakan unalias. Transkrip berikut menunjukkan semua tindakan ini:

pax> cd ; pwd ; ls -ald footy
/home/pax
drwxr-xr-x 2 pax pax 4096 Jul 28 11:00 footy

pax> footydir=/home/pax/footy ; cd "$footydir" ; pwd
/home/pax/footy

pax> cd ; pwd
/home/pax

pax> alias footy='cd /home/pax/footy' ; footy ; pwd
/home/pax/footy

pax> unalias footy ; footy
bash: footy: command not found
paxdiablo
sumber
Terima kasih. Itu bekerja. Saya hanya mencoba alias myfold = '~ / some / path' dan cd myfold. Saya mendapatkan kesalahan - tidak ada direktori seperti itu. Kenapa? Juga, apakah mungkin untuk "membatalkan penetapan" variabel alias?
bashboy
myfold = '~ / some / path' cd "$ myfold" Gagal. Kenapa?
bashboy
1
@bashboy, mungkin karena Anda tidak memiliki direktori dengan nama itu. ~ / some / path adalah contohnya, Anda harus mengganti path sebenarnya yang ingin Anda gunakan. Saya akan mengubahnya untuk menggunakan direktori contoh Anda sehingga lebih jelas. Mengenai cara membatalkan penetapan alias, Anda menggunakan perintah unalias. Saya juga memperbarui jawaban dengan transkrip, termasuk penggunaan perintah itu.
paxdiablo
Bagaimana Anda mempertahankan alias ini dalam sesi terminal yang berbeda? Saat saya membuka tab baru dan mencoba menggunakan alias ini, tidak berhasil.
goldisfine
4
@ goldisfine, lihat tanda kurung saya in one of the bash startup files like .bashrc. Menempatkan alias ke dalam file startup yang sesuai akan memastikan itu tersedia untuk semua sesi.
paxdiablo
74

Ada opsi shell cdable_vars:

cdable_vars
Jika ini disetel, argumen ke cdperintah builtin yang bukan direktori akan dianggap sebagai nama variabel yang nilainya adalah direktori yang akan diubah.

Anda dapat menambahkan ini ke .bashrc:

shopt -s cdable_vars
export myFold=$HOME/Files/Scripts/Main

Perhatikan bahwa saya telah mengganti tilde dengan $HOME; kutipan mencegah ekspansi tilde dan Bash akan mengeluh bahwa tidak ada direktori ~/Files/Scripts/Main.

Sekarang Anda dapat menggunakan ini sebagai berikut:

cd myFold

Tidak $diperlukan. Itulah intinya, sebenarnya - seperti yang ditunjukkan dalam jawaban lain, cd "$myFold"berfungsi tanpa opsi shell. cd myFoldjuga berfungsi jika jalur di myFoldberisi spasi, tidak perlu kutipan.

Ini biasanya bahkan bekerja dengan pelengkapan otomatis tab sebagai _cdfungsi dalam bash_completionpemeriksaan jika cdable_varsdisetel - tetapi tidak setiap implementasi melakukannya dengan cara yang sama, jadi Anda mungkin harus mencari bash_completionlagi di .bashrc(atau edit /etc/profileuntuk menyetel opsi shell).


Kerang lain memiliki opsi serupa, misalnya Zsh ( cdablevars).

Benjamin W.
sumber
1
Apakah ada padanan ini untuk ZSH?
Ryan Stull
1
@RyanStull setopt cdablevarssepertinya memang begitu, tapi saya tidak tahu sama sekali.
Benjamin W.
@JohnMee Saya akan mengembalikan hasil edit Anda, karena a) opsi disebut berbeda di zsh (tanpa garis bawah) b) pertanyaan yang diberi tag hanya Bash dan c) Saya menautkan ke manual Bash. Saya akan menambahkan paragraf untuk menyebutkan cangkang lainnya.
Benjamin
1
Jawaban yang sangat bagus! Terima kasih banyak untukcdable_vars
Lucas P.
1
@Vladislav Perhatikan bahwa pemutusan penyelesaian untuk yang cddisediakan oleh penyelesaian bash, yang menggunakan _cdfungsi ( complete -o nospace -F _cd cd). Menambahkan -vke itu (untuk menyelesaikan pada variabel) bekerja, tetapi dapat memiliki efek samping yang tidak diinginkan - bagi saya, ini menunjukkan lingkungan lengkap saya ketika tab saya selesai.
Benjamin W.
10

Mungkin lebih baik menggunakan tautan

Tautan Lunak

Tautan simbolis atau lunak (file atau direktori, lebih fleksibel dan mendokumentasikan sendiri)

#      Source                            Link
ln -s /home/jake/doc/test/2000/something /home/jake/xxx

Tautan Keras

Tautan keras (hanya file, kurang fleksibel dan tidak mendokumentasikan sendiri)

#    Source                            Link
ln /home/jake/doc/test/2000/something /home/jake/xxx

Cara membuat tautan ke direktori

Petunjuk : Jika Anda tidak ingin melihat tautan di rumah Anda, Anda dapat memulainya dengan titik. ; maka itu akan disembunyikan secara default maka Anda dapat mengaksesnya seperti

cd ~/.myHiddelLongDirLink
Mahmoud Bahnasy
sumber
9

Anda dapat menambahkan jalur apa pun yang Anda inginkan ke hashtable bash Anda:

hash -d <CustomName>=<RealPath>

Sekarang Anda akan bisa cd ~<CustomName>. Untuk membuatnya permanen, tambahkan ke skrip bashrc Anda .

Perhatikan bahwa hashtable ini dimaksudkan untuk menyediakan cache bagi bash agar tidak perlu mencari konten setiap kali perintah dijalankan, oleh karena itu tabel ini akan dihapus pada peristiwa yang membuat cache tidak valid, misalnya memodifikasi $PATH.

Rodrigo Martins de Oliveira
sumber
2
Saya pikir itu hanya akan bekerja zshtetapi tidak dalam bash.
sergej
Ini adalah jawaban terbaik IMHO, tetapi memang benar itu zshhanya berfungsi , setidaknya di sistem Ubuntu saya.
John Stewart
6

Pertama, Anda perlu menghapus tanda kutip:

bashboy@host:~$ myFolder=~/Files/Scripts/Main

Tanda kutip mencegah shell memperluas tilde ke arti khususnya sebagai $HOMEdirektori Anda .

Anda kemudian dapat menggunakan $myFolderlingkungan variabel shell:

bashboy@host:~$ cd $myFolder
bashboy@host:~/Files/Scripts/Main$

Untuk membuat alias , Anda perlu menentukan alias:

alias myfolder="cd $myFolder"

Anda kemudian dapat memperlakukan perintah semacam ini:

bashboy@host:~$ myFolder
bashboy@host:~/Files/Scripts/Main$
David W.
sumber
Ini sebenarnya bukan variabel lingkungan kecuali Anda export.
Keith Thompson
1
@Keompson Oke, itu hanya variabel shell . Tapi, Anda tidak ingin mengekspornya karena Anda tidak ingin itu mempengaruhi proses anak. Anda mendefinisikannya dengan cara ini di .bashrcfile sumber daya Anda atau apa pun yang Anda gunakan, dan itu akan ditentukan di shell langsung, tetapi tidak di skrip shell.
David W.
Saya lebih suka solusi ini karena bekerja dengan penyelesaian otomatis
Vassilis
5

Pertama, Anda memerlukan $untuk mengakses nilai "myFold" agar kode dalam pertanyaan berfungsi:

cd "$myFold"

Untuk menyederhanakan ini, Anda membuat alias di ~/.bashrc:

alias cdmain='cd ~/Files/Scripts/Main'

Jangan lupa untuk membuat sumber .bashrcsekali agar alias tersedia di sesi bash saat ini:

source ~/.bashrc

Sekarang Anda dapat mengubah ke folder menggunakan:

cdmain
hek2mgl
sumber
4

Pilihan lain adalah menggunakan tautan simbolis. yaitu:

ln -s ~/Files/Scripts/Main ~/myFold

Setelah itu Anda bisa melakukan operasi untuk ~/myFold, seperti:

cp some_file.txt ~/myFold

yang akan memasukkan file tersebut ~/Files/Scripts/Main. Anda dapat menghapus tautan simbolis kapan saja denganrm ~/myFold , yang akan menyimpan direktori asli.

dvj
sumber
Satu kelemahan: Jika cd myFolddemikian pwd, itu akan menunjukkan bahwa Anda berada di myFold. Ini adalah deal breaker bagi saya karena perintah relatif dengan kontrol sumber p4 bergantung pada direktori saat ini.
Pengguna5910
1
@ User5910 - gunakanpwd -P
dvj
2

tetapi alias sebenarnya untuk dir juga dimungkinkan, coba

 myScripts="~/Files/Scripts/Main"
 alias myScripts="cd $myScripts"

Dengan cara ini Anda memiliki konvensi penamaan umum (untuk setiap pasangan dir / alias), dan jika Anda perlu menyalin sesuatu dari direktori saat ini ke myScripts, Anda tidak perlu memikirkannya.

IHTH

shellter
sumber
1

Jawaban sebelumnya yang saya coba tidak mengizinkan perluasan otomatis (pelengkapan otomatis) subdirektori dari direktori alias.

Namun, jika Anda mendorong direktori yang ingin Anda alias ke dirsstack ...

$ pushd ~/my/aliased/dir

... Anda kemudian dapat mengetik dirs -vuntuk melihat posisi numeriknya di tumpukan:

 0  ~/my/aliased/dir
 1  ~/Downloads
 2  /media/usbdrive

dan merujuknya menggunakan nomor itu untuk sebagian besar, jika tidak semua perintah yang mengharapkan parameter direktori:

 $ mv foo.txt ~0  

Anda bahkan dapat menggunakan Tabuntuk menampilkan subdirektori langsung dari direktori "aliased":

 $ cd ~0/<Tab>
 child_dir1    child_dir2
chb
sumber
-1

Letakkan baris berikut di myscript Anda

set myFold = '~/Files/Scripts/Main'

Dalam penggunaan terminal

source myscript
cd $myFold
Chayan Pathak
sumber