Masalah dalam skrip dengan spasi dalam nama file

11

Saya punya skrip yang merupakan file dari host jarak jauh ke lokal. Terkadang nama file berisi spasi. scp tidak suka spasi di nama file-nya. Untuk beberapa alasan upaya saya dalam menangani spasi belum menghasilkan jalur scp yang benar.

Kode:

PATH=/var/root/Documents/MyFile OG-v1.2.3.pkg
scp $PATH Me@10.1.10.33:/Users/Me/Desktop

Hasil dalam

Cannot find directory: var/root/Documents/MyFile
Cannot find directory: OG-v1.2.3.pkg

Melampirkan PATH dalam tanda kutip "$PATH"memberikan kesalahan yang sama.

Bertukar ruang untuk ruang yang lolos juga tidak berfungsi, meskipun sejauh yang saya tahu seharusnya:

ESC_PATH=${PATH/' '/'\ '}

meskipun mencetak jalur yang diloloskan menunjukkan bahwa hasil edit bekerja:

echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg
Miles Alden
sumber
4
Tolong jangan gunakan $PATHuntuk variabel Anda sendiri, karena terminal Anda membutuhkannya.
Bernhard

Jawaban:

19

Anda harus mengutip deklarasi dan penggunaannya

path="/var/root/Documents/MyFile OG-v1.2.3.pkg"
scp "$path" Me@10.1.10.33:/Users/Me/Desktop

Jika Anda tidak mengutip yang pertama, $pathhanya akan berisi bagian pertama. Jika Anda tidak mengutip yang kedua, scpakan memperlakukan setiap bagian yang dipisahkan ruang sebagai argumen.

(Saya telah berubah $PATHmenjadi $pathkarena $PATHmerupakan variabel cadangan penting dan Anda tidak boleh menggunakannya untuk tujuan umum.)

Matteo
sumber
1
Sempurna! Terima kasih sejuta @Matteo. Ternyata ada juga ruang awalan yang melemparkan kunci pas ke dalamnya juga.
Miles Alden
1

Saya mencoba sesuatu yang sangat mirip dengan ssh dan melewati baris perintah melaluinya. misalnya

ssh <somehost> ls -l "$PATH"

Saya menemukan bahwa hanya mendefinisikan "$ PATH" tidak berhasil - itu masih memunculkan kesalahan. Namun jika saya berlari

ssh <somehost> ls -l "\"$PATH"\"

Ini berhasil. Triknya adalah untuk memastikan set "" tambahan diteruskan ke perintah ssh dari shell.

Roland Ward
sumber