Was diese Frage inspiriert hat, ist, dass ich die Funktionalität des Watchdog-Geräts teste und überlegt habe, ob es einen in die Shell integrierten Befehl gibt, um das Gerät einfach zu öffnen und nichts zu tun/zu warten, bis es beendet ist?Echo/touch
scheinen das Gerät unmittelbar nach der Durchführung des Vorgangs einfach zu öffnen und zu schließen. Cat
scheint nicht zu funktionieren.
Ich verwende eine C-Anwendung, um das Gleiche zu tun, habe mich aber gefragt, ob Shell-Skript eine Vorkehrung dafür hat
Akzeptierte Antwort:
In Bourne-ähnlichen Muscheln,
exec 3< "$device"
Öffnet das Gerät auf Dateideskriptor 3 der Shell.
Das wäre mehr oder weniger äquivalent zu Cs:
fd = open(device, O_RDONLY);
if (fd < 0) handler_error(...);
if (fd != 3) { dup2(fd, 3); close(fd); }
(ksh93
macht auch ein fcntl(3, F_SETFD, FD_CLOEXEC)
auf diesem fd).
Um es zu schließen:exec 3<&-
In zsh
, ksh93
und bash
, das Äquivalent von fd = open(device, O_RDONLY)
könnte auch geschrieben werden als:
exec {fd}< "$device"
Wobei der Dateideskriptor der erste freie über 9 wäre und in $fd
gespeichert wäre .
Um es zu schließen:exec {fd}<&-
Ersetzen Sie <
mit >
für O_WRONLY|O_CREAT|O_TRUNC
, und mit <>
für O_RDWR|O_CREAT
und >>
für O_WRONLY|O_CREAT|O_APPEND
.
zsh
hat auch ein sysopen
eingebaut (im zsh/system
Modul), wo Sie die Flags genau angeben können.
Beachten Sie, dass in POSIX-kompatiblen Shells exec
ein spezielles eingebautes sein , wenn die Datei nicht geöffnet werden kann, ist dies ein schwerwiegender Fehler, wenn sie nicht interaktiv ist (das Skript wird beendet). Sie können dies mit dem command
deaktivieren Befehl.
if command exec 3< "$device"; then
do-what-you-need-to-do
else
handle-the-error-yourself
fi