Zufällig musste ich mein Skript ATA-ID-zu-Gerätename verwenden (hier zu finden: /server/244944/linux-ata-errors-translating-to-a-device-name/) 426561 # 426561 ) auf einer schreibgeschützten /
Partition. Falls Sie neugierig sind, handelt es sich um eine Ubuntu-Wiederherstellungskonsole, mit der Sie auf Ihre /
Partition zugreifen können, die jedoch standardmäßig schreibgeschützt bereitgestellt wird. Ich freue mich darüber, denn sonst hätte ich wahrscheinlich nie herausgefunden, dass sich mein Skript aufgrund einer bestimmten Zeile auf einem R / O-System seltsam verhält:
IFS=: read HostMain HostMid HostSub <<< "$HostFull"
Dies funktioniert nicht , wenn keine Schreibberechtigung vorliegt. Ich hätte allerdings nicht angenommen, dass es scheitern würde. Aber anscheinend der <<<
Bediener nicht erfordert eine temporäre Datei irgendwo zu schreiben.
Aber gibt es eine Möglichkeit, die Erstellung einer temporären Datei zu umgehen, oder gibt es eine Möglichkeit, anzugeben, wohin die Datei geschrieben wird? In der Ubuntu-Wiederherstellungskonsole gibt es - seltsamerweise - Schreibberechtigungen für das /run
Verzeichnis, so dass dies ausreichen würde, wenn ich irgendwie "sagen" könnte read
, dass die temporäre Datei an einen anderen Ort als gewöhnlich geschrieben werden soll.
/dev/fd
hat nichts damit zu tun.<<<
ist jedoch der Schuldige, weil es eine temporäre Datei erstellt (die irgendwo geschrieben werden muss).Antworten:
Ein Array kann die Zeichenfolge analysieren, ohne dass eine temporäre Datei erforderlich ist. Vergessen Sie nicht, das Globbing auszuschalten.
quelle
IFS
, wenn Sie sicher sind, dass keine Leerzeichen vorhanden sind$HostFull
:Hosts=( ${HostFull//:/ } )
. Oder auch wenn es Leerzeichen gibt:HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*}
(oder ähnliches, ich werde verwirrt:D
).Ich stimme @gniourf_gniourf zu, Sie benötigen wahrscheinlich Schreibzugriff, aber nicht auf die Dateideskriptoren, höchstwahrscheinlich eine Datei.
Sie können dies testen, indem Sie die Ausführung Ihres Befehls in der schreibgeschützten Partition verfolgen.
Das Obige wird
strace
auf der Bash-Shell (Prozess$$
) ausgeführt. Es schläft dann für 1 Sekunde und läuft dann dieread
von der HERE STRING. Ich habe die Saite"hi"
in diese Position gebracht. Ich dannsleep
noch eine Sekunde und dannkill
diestrace
.Beispiel
Beim Parsen dieser Ausgabe werden Sie feststellen, dass eine Datei als geöffnet
O_WRONLY
wird, um in eine Datei zu schreiben.Oben sehen wir, in welche Datei Ihre Befehlssequenz schreibt.
quelle
read
dass eine Datei zum Schreiben geöffnet wird (das wäre albern), es ist<<<
./tmp
es sich um einen fest codierten Pfad handelt. Und wahrscheinlich haben Sie es erraten,/tmp
IST schon da, aber auch schreibgeschützt! Und da ich bei der Arbeit an dieser Wiederherstellungskonsole in meinem Live- Dateisystem angemeldet bin, möchte ich mich dort nicht durch Symlinking oder was auch immer (nicht einmal in dieser Konsole) einmischen.Ich finde Positionsparameter für diese Art von Aufgabe sehr nützlich. Es ist im Allgemeinen auch für alle Shells portierbar und kostet weder Gabeln noch temporäre Dateien.
quelle
$1
,$2
,$3
Material: dass in einem Skript erinnern, dies wird in der Regel für ein Argument an das Skript übergeben steht sich . - Und wenn wir schon dabei sind: Wenn IFS ein Leerzeichen sein soll, reicht * IFS = * in dieser Syntax nicht aus; Sie müssen IFS = '' explizit angeben .