Hanya secara kebetulan saya harus menggunakan skrip ATA-ID-to-device-name saya (ditemukan di sini: /server/244944/linux-ata-errors-translating-to-a-device-name/ 426561 # 426561 ) pada partisi read-only /
. Jika Anda penasaran, itu adalah konsol pemulihan Ubuntu yang akan memungkinkan Anda mengakses /
partisi Anda , tetapi akan me-mountnya hanya-baca secara default. Saya senang tentang itu, karena kalau tidak saya mungkin tidak akan pernah menemukan bahwa skrip saya berperilaku aneh pada sistem R / O karena garis tertentu, ini:
IFS=: read HostMain HostMid HostSub <<< "$HostFull"
Ini tidak berfungsi jika tidak ada izin tertulis. Tapi saya tidak akan mengira itu akan gagal. Namun ternyata <<<
operator memang perlu menulis beberapa file sementara ke suatu tempat.
Tetapi apakah ada cara untuk menghindari pembuatan file sementara, atau, apakah ada cara untuk menentukan di mana file itu ditulis? Di konsol pemulihan Ubuntu, ada --- anehnya --- menulis izin pada /run
direktori, jadi itu bisa dilakukan, jika saya bisa "menyuruh" read
untuk menulis file temp ke tempat lain daripada biasanya.
/dev/fd
tidak ada hubungannya dengan ini.<<<
adalah pelakunya, karena itu membuat file sementara (yang perlu ditulis di suatu tempat).Jawaban:
Array dapat membuat string parsing tanpa perlu file temporal. Jangan lupa mematikan globbing.
sumber
IFS
, jika Anda yakin tidak ada spasi di$HostFull
sebagai begitu:Hosts=( ${HostFull//:/ } )
. Atau bahkan jika ada spasi:HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*}
(atau yang serupa, saya jadi bingung:D
).Saya setuju dengan @gniourf_gniourf, Anda mungkin memerlukan akses tulis tetapi tidak ke deskriptor file, kemungkinan besar file.
Anda dapat menguji ini dengan melacak eksekusi perintah Anda saat berada di partisi readonly.
Di atas akan berjalan
strace
pada Bash shell (proses$$
). Kemudian tidur selama 1 detik, dan kemudian menjalankanread
dari SINI STRING. Saya sudah meletakkan string"hi"
di posisi ini. Saya kemudiansleep
untuk satu detik dan kemudiankill
yangstrace
.Contoh
Saat mem-parsing output ini Anda akan melihat bahwa file dibuka sebagai
O_WRONLY
, yang untuk menulis ke file.Di atas kita dapat melihat file apa yang sedang ditulis oleh urutan perintah Anda.
sumber
read
membuka file untuk menulis (itu akan konyol), itu<<<
./tmp
ini adalah jalur yang sulit dikodekan . Dan mungkin Anda sudah menebaknya,/tmp
IS sana sudah, tetapi hanya-baca juga! Dan karena bekerja pada konsol pemulihan akan membuat saya masuk ke sistem file langsung saya , saya tidak ingin mengacaukan di sana dengan symlinking atau apa pun (tidak bahkan saat di konsol itu).Saya menemukan parameter posisi sangat berguna untuk tugas semacam ini. Ini umumnya portabel untuk semua shell juga, dan tidak ada biaya garpu atau file sementara.
sumber
$1
,$2
,$3
hal: ingat bahwa dalam naskah, ini biasanya akan berdiri untuk argumen dilewatkan ke script itu sendiri . - Dan sementara kita berada di dalamnya: jika IFS dimaksudkan sebagai spasi, * IFS = * tidak akan melakukan dalam sintaks ini; Anda harus menentukan IFS = '' secara eksplisit.