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