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