Zbiegiem okoliczności musiałem użyć skryptu ATA-ID-na-nazwę-urządzenia (tutaj: /server/244944/linux-ata-errors-translating-to-a-device-name/ 426561 # 426561 ) na partycji tylko do odczytu/
. Jeśli jesteś ciekawy, była to konsola odzyskiwania Ubuntu, która pozwoli ci uzyskać dostęp do twojej /
partycji, ale domyślnie zainstaluje ją tylko do odczytu. Cieszę się z tego, ponieważ w przeciwnym razie prawdopodobnie nigdy nie dowiedziałbym się, że mój skrypt zachowuje się dziwnie w systemie R / O z powodu określonej linii, tej:
IFS=: read HostMain HostMid HostSub <<< "$HostFull"
To nie działa, jeśli nie ma uprawnień do zapisu. Jednak nie przypuszczałbym, że to zawiedzie. Ale najwyraźniej <<<
operator nie musi gdzieś zapisać pliku tymczasowego.
Ale czy jest jakiś sposób na obejście tworzenia pliku tymczasowego, czy też istnieje sposób na określenie, gdzie plik jest zapisywany? W konsoli odzyskiwania Ubuntu istnieje --- dziwnie --- uprawnienie do zapisu w /run
katalogu, więc tak by się stało , gdybym mógł w jakiś sposób „powiedzieć”, read
aby zapisać plik tymczasowy w innym miejscu niż zwykle.
/dev/fd
nie ma z tym nic wspólnego.<<<
jest jednak winowajcą, ponieważ tworzy plik tymczasowy (który gdzieś trzeba zapisać).Odpowiedzi:
Tablica może parsować łańcuch bez potrzeby tworzenia pliku tymczasowego. Nie zapomnij wyłączyć globowania.
źródło
IFS
, jeśli jesteś pewien, że nie ma miejsca w$HostFull
jak tak:Hosts=( ${HostFull//:/ } )
. Lub nawet jeśli są spacje:HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*}
(lub coś podobnego, jestem zdezorientowany:D
).Zgadzam się z @gniourf_gniourf, prawdopodobnie potrzebujesz dostępu do zapisu, ale nie do deskryptorów plików, najprawdopodobniej pliku.
Możesz to sprawdzić, śledząc wykonanie polecenia na partycji tylko do odczytu.
Powyższe będzie działać
strace
na powłoce Bash (proces$$
). Następnie śpi przez 1 sekundę, a następnie uruchamiaread
TUTAJ STRING. Ustawiłem sznurek"hi"
w tej pozycji. I wtedysleep
dla jednego więcej sekundę, a następnie .kill
strace
Przykład
Podczas analizowania tego wyniku zauważysz, że plik jest otwierany jako
O_WRONLY
, co służy do zapisu do pliku.Powyżej możemy zobaczyć, do którego pliku jest zapisywana sekwencja poleceń.
źródło
read
otwiera pliku do pisania (to byłoby głupie), to jest<<<
./tmp
jest ustalony tor. I pewnie zgadliście,/tmp
JEST już tam, ale tylko do odczytu! A ponieważ praca nad tą konsolą odzyskiwania spowoduje, że zaloguję się do mojego systemu plików na żywo , nie chciałbym tam wchodzić przez połączenie symboliczne lub cokolwiek innego (nawet będąc w tej konsoli).Uważam, że parametry pozycyjne są bardzo przydatne do tego rodzaju zadań. Zasadniczo jest również przenośny dla wszystkich powłok i nie kosztuje forksów ani plików tymczasowych.
źródło
$1
,$2
,$3
materiał: należy pamiętać, że w skrypcie, to zwykle stoją za argument przekazany do skryptu samego . - A skoro już o tym mowa: jeśli IFS ma być spacją, * IFS = * nie zrobi tego w tej składni; musisz jawnie podać IFS = '' .