Bagaimana Anda memasukkan direktori yang namanya hanya minus?

26

Saya mengunduh lebih sedikit ke server web saya dan membuka ritsletingnya.

Ini berisi folder bernama -. Saya berasumsi saya tahu bagaimana menghadapinya, tetapi saya tidak tahu.

Saya sudah mencoba cd -- -, tetapi itu tidak memiliki efek yang diinginkan. Menggunakan tanda kutip juga tampaknya tidak mempengaruhinya. Saya menempatkan garis miring di semua tempat, tetapi tidak berhasil.

Apa cara yang tepat untuk mengubah ke folder ini?

Der Hochstapler
sumber

Jawaban:

34

Anda ingin menghindarinya dari menjadi parameter, jadi kami mencoba untuk menambahkan sesuatu padanya. Direktori saat ini dapat diakses dengan ., sehingga subfolder -dapat diakses secara alternatif dengan ./-.

cd ./-

Alasan yang cd -- -tidak berhasil adalah karena ini diterapkan secara berbeda jika Anda membandingkan rm(lihat man rm) dengan cd(lihat man bashatau man cd), cdmemiliki interpretasi berbeda yang dilihat -sebagai parameter (lihat man bashatau man cd).

Juga harus dicatat bahwa cdini adalah fungsi shell builtin, seperti yang dapat dibaca dalam jawaban ini :

cdbukan perintah eksternal - ini adalah fungsi shell builtin. Ini berjalan dalam konteks shell saat ini, dan tidak, seperti yang dilakukan perintah eksternal, dalam konteks fork / exec'd sebagai proses yang terpisah.

Ada cdperintah eksternal , tetapi melakukan sesuatu yang sama sekali berbeda .

Ini menjelaskan mengapa implementasinya berbeda, karena Bash dan Coreutils adalah dua hal yang berbeda.

Anggap saja Anda tidak akan percaya ini, bagaimana kami mengonfirmasi itu? Gunakan whichdan type.

 $ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
 $ which rm && type rm
/bin/rm
/bin/rm is /bin/rm

Lihat man whichuntuk informasi lebih lanjut, dan man bashatau man typeuntuktype

Tamara Wijsman
sumber
4
Tidak, "-" diterapkan di semua utilitas standar, tetapi dimaksudkan untuk mengakhiri opsi. "-" saja tidak dikenali sebagai opsi tetapi sebagai direktori sebelumnya.
Stéphane Chazelas
4
Solusi yang benar, tetapi penjelasannya salah. Itu sama sekali tidak relevan yang cdmerupakan builtin. Alasannya cd -- -tidak bekerja adalah itu -adalah operan, bukan opsi.
Gilles 'SANGAT berhenti menjadi jahat'
1
pada Mac OS X cd -- -akan mengubah Anda ke direktori bernama -di direktori saat ini. FWIW.
Tim Kennedy
Sebagian besar komentar tercermin di bagian kedua posting saya.
Tamara Wijsman
22

Suatu minus (alias tanda hubung) saja bukanlah suatu pilihan, tetapi suatu operan (yaitu argumen yang bukan suatu opsi). Karena itu, menempatkan --sebelum itu tidak berpengaruh. Tanda hubung adalah operan di cd -dan masih operan di cd -- -. Seperti utilitas standar lainnya, cdmemperlakukan operan sebagai operan terlepas dari apakah ada --sebelumnya.

The cdperintah memberikan arti khusus untuk operan -. Yang lainnya adalah direktori untuk beralih. cd -- -aberalih ke direktori yang dipanggil -a, karena -atidak khusus sebagai operan dan --mencegah cdmemperlakukannya sebagai opsi. Ini tidak bekerja -sendiri yang bukan pilihan.

Meletakkan tanda kutip di sekitar -tidak akan membantu, karena pada akhirnya itu akan melewati operan -.

Karenanya, satu-satunya jalan Anda adalah menemukan cara lain untuk mengekspresikan ide yang sama, yaitu nama lain untuk direktori yang sama. Untungnya, ada yang mudah: jika Anda menambahkan ./sebelum nama file relatif, itu masih berarti file yang sama. Itu ./membuat perbedaan yang tidak relevan dalam kasus kami: CDPATHtidak dikonsultasikan ketika nama direktori dimulai dengan /, ./atau ../. Demikian:

cd ./-

Cara lain, karena -adalah direktori, adalah dengan menambahkan /setelahnya. Menambahkan a /di akhir nama file memastikan bahwa file diperlakukan sebagai direktori (khususnya, perintah akan beroperasi pada direktori itu sendiri dan bukan pada symlink jika file tersebut adalah tautan simbolik ke direktori), tetapi sebaliknya membuat tidak ada perbedaan. Demikian:

cd -- -/

Menulis -/disarankan oleh kode penyelesaian, omong-omong, tetapi dalam bash hanya benar-benar berfungsi dengan --sebelumnya, bash tidak memiliki kasus khusus untuk cd -/(zsh tidak).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Itu mengejutkan saya, saya benar-benar mencoba cd -- -/, tetapi karena telah menjalankan yang setara cd -sebelum itu, direktori sebenarnya tidak ada dan saya menafsirkannya sebagai upaya gagal lainnya.
Der Hochstapler
5

Memenuhi syarat dengan jalur adalah satu opsi.

cd ./-
iruvar
sumber
2

Ini juga akan bekerja:

cd ~/'-'

atau

cd ~/"-"
Michael Durrant
sumber
1
tetapi hanya jika itu terjadi di direktori home
RiaD
1
... dan kutipan tidak perlu.
Scott