Bash script ke cd ke direktori dengan spasi di pathname

96

Saya menggunakan Bash di macOS X dan saya ingin membuat file skrip yang dapat dieksekusi sederhana yang akan berubah ke direktori lain saat dijalankan. Namun, jalur ke direktori tersebut memiliki spasi di dalamnya. Bagaimana sih kamu melakukan ini? Inilah yang saya miliki ...

Nama file: cdcode

Isi file:

cd ~/My Code

Sekarang diberikan, ini bukan nama jalur yang panjang, tetapi nama jalur saya yang sebenarnya adalah lima direktori sedalam dan empat dari direktori tersebut memiliki spasi di jalurnya.

BTW, saya sudah mencoba cd "~/My Code"dan cd "~/My\ Code"dan tak satu pun dari ini bekerja.

Benjamin W.
sumber
1
Saya mengalami masalah yang sama seperti yang dijelaskan. Yaitu tidak ada cara yang mungkin untuk mengubah ke direktori yang memiliki spasi di dalamnya. Tidak ada yang seperti: cd "My Passport" cd My \ Passport cd "Passport" saya tidak ada yang berfungsi. Komitmennya bekerja dengan baik. Saya dapat mendaftar: ls -l My \ Passport / berfungsi dengan baik. \> uname -a Linux host 2.6.18-8.1.8.el5.centos.plus # 1 SMP Sen 16 Jul 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash, versi 3.1 .17 (1) -release- (i686-redhat-linux-gnu) ada ide, tolong?
Denis C

Jawaban:

81

Saat Anda mengutip dua kali jalur, Anda menghentikan ekspansi tilde. Jadi ada beberapa cara untuk melakukan ini:

cd ~/"My Code"
cd ~/'My Code'

Tilde tidak dikutip di sini, sehingga ekspansi tilde tetap dijalankan.

cd "$HOME/My Code"

Anda dapat memperluas variabel lingkungan di dalam string yang dikutip ganda; ini pada dasarnya adalah apa yang dilakukan ekspansi tilde

cd ~/My\ Code

Anda juga dapat keluar dari karakter khusus (seperti spasi) dengan garis miring terbalik.

derobert
sumber
3
Anda bahkan dapat melakukan cd ~ / My '' Code, tetapi itu akan konyol ketika Anda dapat menghindarinya dengan garis miring terbalik
Nick Dixon
42

Saya menemukan solusi di bawah ini di halaman ini :

x="test\ me"  
eval cd $x

Kombinasi \konstanta teks kutip ganda dan evalsebelum cdmembuatnya bekerja seperti pesona!

user365757
sumber
kejelasan lebih lanjut: Untuk berpindah ke direktori file skrip: DIR = $ (dirname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert
1
Ini sangat membantu saya menjalankan skrip bash pada mesin OS X. 🎉
timbillstrom
Sebenarnya tidak perlu di evalsini.
Benjamin W.
2
Di OS X, saya tidak bisa mendapatkan jawaban lain / sebelumnya untuk bekerja tanpanya eval.
D. Woods
11

Setelah berjuang dengan masalah yang sama, saya mencoba dua solusi berbeda yang berhasil:

1. Gunakan tanda kutip ganda ( "") dengan variabel Anda.

Cara termudah, cukup gandakan variabel Anda seperti yang ditunjukkan pada jawaban sebelumnya:

cd "$yourPathWithBlankSpace"

2. Memanfaatkan eval.

Menurut jawaban ini perintah Unix untuk keluar dari spasi, Anda dapat menghapus spasi kosong lalu gunakan eval, seperti ini:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped
HanniBaL90
sumber
10
cd ~/My\ Code

tampaknya berhasil untuk saya ... Jika menghapus tanda kutip tetapi tetap memangkas tidak berhasil, dapatkah Anda memposting beberapa kode contoh?

Andrew Flanagan
sumber
10

Anda dapat menggunakan salah satu dari:

cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"

Anda tidak dapat menggunakan:

cd ~"/My Code"

Yang pertama berfungsi karena shell mengembang ~ / menjadi $ HOME /, lalu memasang Kode Saya tanpa tanda kutip ganda. Gagal kedua karena tidak ada pengguna yang disebut ' "' (tanda kutip ganda) untuk ~"dipetakan.

Jonathan Leffler
sumber
4

Satu garis miring terbalik bekerja untuk saya:

ry4an@ry4an-mini:~$ mkdir "My Code"

ry4an@ry4an-mini:~$ vi todir.sh

ry4an@ry4an-mini:~$ . todir.sh 

ry4an@ry4an-mini:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

Apakah Anda yakin masalahnya bukan karena skrip shell Anda mengubah direktori di subkulitnya, tetapi kemudian Anda kembali ke shell utama (dan direktori asli) setelah selesai? Saya menghindari itu dengan menggunakan. untuk menjalankan skrip di shell saat ini, meskipun kebanyakan orang hanya akan menggunakan alias untuk ini. Ruang-ruang itu bisa menjadi ikan haring merah.

Ry4an Brase
sumber
Terima kasih, Ry4an (dan responden lainnya). Sepertinya saya menjalankan skrip dengan tidak benar. Saya hanya mencoba menjalankannya seperti ini:% ./cdsomedir Saya tidak menyadari bahwa saya perlu menggunakan "." untuk menjalankan skrip seperti yang Anda lakukan:%. cdsomedir.sh Setelah saya melakukannya, itu berhasil. Kesalahan pemula. Terima kasih!
3

Hindari ~ dalam skrip; gunakan $ HOME sebagai gantinya.

Chris FA Johnson
sumber
2

Saat bekerja di Linux, sintaks di bawah ini benar:

cd ~/My\ Code

Namun saat Anda menjalankan file Anda, gunakan sintaks di bawah ini:

$ . cdcode

(hanya '.' dan bukan './')

Alterlife
sumber
Karena penasaran, mengapa itu penting? Saya hanya pernah melihat './' digunakan.
whaley
./ akan menelurkan shell baru, lalu mengubah direktori. Jadi ketika skrip keluar, ia kembali ke shell yang menelurkan shell baru ... Anda akan berada di direktori tempat Anda mengeksekusi skrip alih-alih ~ / My Code. '.' di sisi lain menyebabkan skrip akan dieksekusi dalam contoh shell saat ini.
Alterlife
Titik "." adalah perintah unix, alias untuk perintah "source". Ini harus diikuti dengan nama file. Jadi "source myfile" akan menjalankan file di dalam shell Anda saat ini. Dan ". Myfile" akan melakukan hal yang sama. Variabel "./" berarti "direktori saat ini" dan bukan merupakan perintah.
JPGConnolly
2

gunakan tanda kutip ganda

go () 
{ 
    cd "$*"
}
Bobo
sumber
Terima kasih. Penambahan yang berguna untuk fungsi dalam .bashrcfile untuk mengubah direktori saat menempelkan nama direktori yang berisi spasi ke baris perintah tanpa harus keluar dari spasi atau mengutip semuanya. cdsadalah nama yang lebih baik.
mattst
Apakah ada cara untuk memperluas ini (tanpa if) sehingga hanya goakan setara dengan cd, misalnya, cd ke direktori home?
zennehoy
2

Cara yang paling sederhana untuk melakukan ini adalah-

 $ cd My\ Folder

Di bash, jalankan perintah DIR dan dalam hasil Anda akan melihat bahwa nama folder atau jalur yang memiliki spasi di antara mereka telah ditulis dalam hasil seperti ini -

$dir
My\ Folder
New\ Folder
Mayukh Datta
sumber
2

Ini akan melakukannya:

cd ~/My\ Code

Saya harus menggunakannya untuk bekerja dengan file yang disimpan di iCloud Drive. Anda tidak ingin menggunakan tanda kutip ganda (") karena ini harus berupa jalur absolut. Dengan kata lain, Anda tidak dapat menggabungkan tanda kutip ganda dengan tilde (~).

Sebagai contoh, saya harus menggunakan ini untuk proyek terbaru:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

Saya harap itu membantu.

Josh
sumber
1

Saya memiliki masalah yang sama sekarang adalah saya menggunakan skrip bash untuk membuang beberapa data. Saya akhirnya membuat tautan simbolis di folder skrip tanpa spasi di dalamnya. Saya kemudian mengarahkan skrip saya ke tautan simbolis dan itu berfungsi dengan baik.

Untuk membuat tautan Anda. ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]

Mau atau mungkin tidak berguna.


sumber
1

Gunakan tanda kutip tunggal, seperti:

myPath=~/'my dir'

cd $myPath
Jadian
sumber