Co inspirovalo tuto otázku je, že testuji funkčnost zařízení hlídacího psa a přemýšlel jsem, zda existuje příkaz vestavěný do shellu, který by zařízení prostě otevřel a nedělal nic/nečekal, dokud nebude ukončen?Echo/touch Zdá se, že pouze otevírá a zavírá zařízení ihned po provedení operace. Kočka zdá se, že nefunguje.
Používám aplikaci v jazyce C, abych udělal totéž, ale zajímalo by mě, jestli to má skript shellu
Přijatá odpověď:
Ve skořápkách podobných Bourne
exec 3< "$device"
Otevře zařízení na deskriptoru souboru 3 shellu.
To by bylo víceméně ekvivalentní C:
fd = open(device, O_RDONLY);
if (fd < 0) handler_error(...);
if (fd != 3) { dup2(fd, 3); close(fd); }
(ksh93 také provede fcntl(3, F_SETFD, FD_CLOEXEC) na tom fd).
Chcete-li jej zavřít:exec 3<&-
V zsh , ksh93 a bash , ekvivalent fd =open(device, O_RDONLY) lze také napsat jako:
exec {fd}< "$device"
Kde deskriptor souboru by byl první volný nad 9 a uložený v $fd .
Chcete-li jej zavřít:exec {fd}<&-
Nahraďte < pomocí > pro O_WRONLY|O_CREAT|O_TRUNC a pomocí <> pro O_RDWR|O_CREAT a >> pro O_WRONLY|O_CREAT|O_APPEND .
zsh má také sysopen vestavěný (v zsh/system module), kde můžete přesně specifikovat příznaky.
Všimněte si, že v shellech vyhovujících POSIX, exec je speciální vestavěná , pokud soubor nelze otevřít, jedná se o kritickou chybu, když není interaktivní (ukončí skript). Můžete to zakázat pomocí příkazu příkaz.
if command exec 3< "$device"; then
do-what-you-need-to-do
else
handle-the-error-yourself
fi