Tidak dapat melakukan cd ke direktori dengan spasi di namanya, bahkan dengan kutipan atau melarikan diri

0

Dalam bash shell pada mesin MacOS, saya bisa melihat dengan mengetik ls bahwa ada seorang sutradara Application Support:

$ ls
Accounts                FontCollections     PreferencePanes
Application Scripts     Fonts               Preferences
Application Support     GameKit             Printers
Assistant               Google              PubSub
Assistants              Group Containers    Safari
Audio                   IdentityServices    SafariSafeBrowsing
Caches                  Input Methods       Saved Application State
Calendars               Internet Plug-Ins   Screen Savers
CallServices            Keyboard            Services
ColorPickers            Keyboard Layouts    Sharing
Colors                  KeyboardServices    Sounds
Compositions            Keychains           Spelling
Containers              LanguageModeling    Suggestions
Cookies                 LaunchAgents        SyncedPreferences
CoreFollowUp            Library             VirtualBox
Developer               Logs                Voices
Dictionaries            Mail                WebKit
F5Networks              Messages            com.apple.internal.ck
Family                  Metadata            iMovie
Favorites               Mobile Documents
FileProvider            Passes

Namun, jika saya mencoba cd ke dalam direktori ini menggunakan kutipan atau karakter melarikan diri seperti yang dijelaskan dalam Bagaimana cara cd ke direktori yang berisi spasi dalam namanya? , Saya masih mendapatkan kesalahan:

LM-SJN-21018636:Library kupeek$ cd "Application Support"
-bash: cd: Application: No such file or directory
LM-SJN-21018636:Library kupeek$ cd Application\ Support
-bash: cd: Application: No such file or directory

Sepertinya bash tidak 'mengambil' tanda kutip atau melarikan diri karakter dan malah mencari direktori yang disebut "Aplikasi". Adakah ide mengapa ini tidak berhasil?

Kurt Peek
sumber
2
Mungkin Anda memiliki alias atau sejenisnya untuk cd itu ditulis dengan buruk. Apa tidak command -v cd mencetak?
meuh
2
Saya akan menduga fungsi yang ditulis dengan buruk. Dan saya pikir command -v cd dari komentar pertama seharusnya command -V cd (modal V); type -a cd juga harus bekerja.
Kamil Maciorowski
1
Apa yang terjadi jika Anda "mengisi otomatis" dengan tombol-Tab? Kesalahan yang sama?
Aulis Ronkainen

Jawaban:

5

Anda cd mungkin fungsi atau alias yang tidak didefinisikan dengan baik. Menjalankan type -a cd untuk mencari tahu.

Kemungkinan alias dijelaskan di jawaban lain ini . Jawaban saya berkonsentrasi pada fungsi shell.

Misalnya jika fungsi yang digunakan

  • command cd $* ( command builtin menjelaskan sini ) atau
  • command cd $@ atau
  • command cd $1

bukannya benar

  • command cd "$@" atau
  • command cd "$1" (tidak sebagus di atas, masih belum fatal)

dan Bash Anda tidak melempar too many arguments (versi pra-4.4, lihat pertanyaan ini ), perilaku akan persis seperti yang Anda gambarkan karena Application Support menjadi argumen tunggal untuk fungsi akan mengalami pemisahan kata di dalam fungsi itu sendiri, jadi command cd akan melihat Application sebagai argumen pertamanya.

Jika Anda cd memang fungsi yang tidak didefinisikan dengan baik, Anda harus melacak tempat di mana ia didefinisikan dan memperbaikinya. Sebuah AD hoc solusi akan menambahkan command kata sebelumnya cd, seperti ini:

command cd "Application Support"

atau

command cd Application\ Support

(Ini juga akan berfungsi jika alias adalah pelakunya).

Kamil Maciorowski
sumber
1

Coba gunakan lebih dari satu set kutipan,

misalnya tuliskan nama dalam tanda kutip tunggal dalam tanda kutip ganda:

cd "'Application Support'"

"Argumen yang dilampirkan dalam tanda kutip ganda menyajikan dirinya sebagai satu kata, bahkan jika itu berisi pemisah spasi Panduan Script Bash Lanjutan

Menggunakan dua set tanda kutip (tanda kutip dalam tanda kutip) adalah solusi yang dapat dilakukan, dengan asumsi bahwa masalahnya adalah yang asli cd perintah telah alias. Definisi berikut

alias cd='eval command cd'

akan mereproduksi masalah yang dilaporkan di sini (dalam versi Bash pra-4.4, lihat jawaban ini ). Itu terjadi eval mem-parsing baris perintah untuk kedua kalinya dan, pada pass pertama parsing, satu lapisan kutipan dihapus Menggunakan dua set tanda kutip bekerja karena, menghapus set tanda kutip pertama, eval akan meneruskan argumen dengan set kutipan kedua ke cd.

Jika alias demikian, solusi terbaik adalah memperbaikinya sejak awal.

GiopperOne
sumber
Sederhana. Saya percaya masalahnya di sini adalah bahwa perintah "cd" asli telah dihapus. Alias ​​mendapatkan string path sebagai argumen dan mendapatkannya dengan benar jika Anda menempatkan set kutipan pertama. Kemudian ia meneruskannya ke "cd" tetapi pergi ke sana tanpa tanda kutip dan gagal. Jika Anda menaruh dua set tanda kutip, alias mendapatkan string dengan set pertama dan kemudian meneruskannya ke "cd" dengan set tanda kutip kedua dan ... Magic, itu berhasil!
GiopperOne
Terima kasih atas saran Anda, saya mengedit jawaban saya dan menambahkan referensi. Saya tidak perlu menjelaskan di sini cara memodifikasi alias "cd", itu akan menjadi off-topic. Saya menjawab pertanyaan "Ada ide mengapa ini tidak berhasil?", Jawabannya adalah karena menggunakan tanda kutip tunggal saja. Masukkan dalam tanda kutip ganda dan itu akan berhasil.
GiopperOne
Kerja bagus! Terimakasih atas kerjasamanya.
Kamil Maciorowski
0

Mungkin ada lebih banyak tempat kosong atau karakter tidak-cetak lainnya yang tidak Anda lihat. Mencoba cd Application*Scrip* atau serupa.

Aganju
sumber
1
Ini bisa terjadi dalam beberapa kasus lain, tetapi tidak dalam kasus khusus ini. Perhatikan pesannya -bash: cd: Application: No such file or directorytidak -bash: cd: Application Support: No such file or directory. Perintah tidak melihat seluruh string argumen di tempat pertama.
Kamil Maciorowski
0

JIKA anda cd bukan alias aneh, maka saya hanya akan menggunakan TAB dengan bash's autocomplete (jika diaktifkan) untuk mengisi format yang berfungsi untuk Anda.

Mengetik

cd Ap TAB

Sepertinya itu harus mengisi otomatis ke sesuatu seperti

cd Application\ S

(Jika Anda memiliki alias cd aneh, maka tambahkan jawaban mengetik Kamil command cd A... harus bekerja dengan TAB juga)

dan kemudian menunggu Anda untuk mengetik lebih banyak nama yang diinginkan (diikuti oleh yang lain TAB untuk melengkapi secara otomatis sisanya). Atau hanya mengetik TAB satu atau dua kali lagi akan menampilkan opsi yang tersedia.

(Saya juga tidak menggunakan polos lstapi ls -la atau mungkin ls -1 alih-alih hanya melihat satu entri per baris, Anda ls output tidak jelas)

Xen2050
sumber
Ini mungkin saran yang bagus dalam kasus umum (mis. Untuk pengguna masa depan dengan masalah yang sama) tapi saya ragu itu akan segera membantu OP. Perhatikan pesannya Application: No such file or directorytidak Application Support: No such file or directory. Jika nama direktori pada baris perintah tidak cocok dengan nama sebenarnya, cd masih akan mematuhi seluruh argumen yang salah. Saya tidak mengecilkan jawaban yang mungkin berlaku untuk masalah yang sangat mirip, masih saya perhatikan mereka tidak sepenuhnya cocok dengan masalah OP dan mereka tidak dapat menjelaskan akar dari itu.
Kamil Maciorowski
Saya juga berpikir begitu, tapi agak menyebalkan kalau judulnya tidak sepenuhnya cocok dengan masalah sebenarnya (" Saya cd rusak "), dan tab complete hanya disebutkan secara singkat dalam komentar, jadi jawaban yang lebih lengkap untuk" masalah judul "tampaknya tepat.
Xen2050
-1

Itu karena Anda kehilangan satu kata. Coba gunakan:

cd "Application Support GameKit"
Biku Balami
sumber
Saya mengulangi diri saya sendiri: Ini bisa jadi dalam beberapa kasus lain, tetapi tidak dalam kasus ini. Perhatikan pesannya -bash: cd: Application: No such file or directorytidak -bash: cd: Application Support: No such file or directory. Perintah tidak melihat seluruh string argumen di tempat pertama.
Kamil Maciorowski
Anda salah membaca OP; mereka 2 kolom berbeda
Tetsujin