Если в настоящее время выполняется команда4
, то это можно сделать довольно просто:
^Z
$ fg && right_command5 && command6
Это, по сути, то, что Вы уже делали для запуска команды4
в первую очередь. wrong_command5
, а остальное будет заменено и никогда не будет выполнено.
Я думаю, что такое поведение будет неожиданным для вас, так что читайте дальше для объяснения того, где вещи работают не так, как вы думали.
Однако: обратите внимание, что ваша исходная последовательность команд не делает того, что вы думаете . Когда вы это сделаете:
$ command1 && command2 && command3
Running command1 ...
Running command2 ...^Z
[1]+ Stopped
$ fg && command4
тогда команда2
будет возобновлена, , но остальная часть цепочки не будет . Остановка команды 2
с помощью Ctrl-Z означает, что она выходит аномально с помощью SIGTSTP
(-20). Поскольку команда 2
выходит неслучайно, &&
короткое замыкание вне цепи и команда3
никогда не будет выполнена. Команда 4
будет запущена сразу же после окончания возобновленной команды 2
.
Вы можете наблюдать за этим поведением в действии, заменив &&
на ||
:
$ command2 || echo Running command3, exit was $?
^Z
[1]+ Stopped command2
Running command3, exit was 148
$
Вам необходимо перечислить всю последующую цепочку команд при возобновлении, если вы хотите, чтобы поведение, к которому вы стремитесь, было таким, каким вы стремитесь. В качестве альтернативы, если вы хотите иметь возможность остановить и возобновить цепочки команд, вы должны запустить их в подоболочке:
$ (command1 && command2 && command3)
^Z
$ fg
В этом случае, однако, нет никакого способа вмешаться и заменить команду вообще.
Файлы устройства AFAIK являются единственным вариантом для процессов пользователя, чтобы получить доступ к устройствам. Ядро не волнует, является ли этот процесс оболочкой.
C Программы имеют вариант для тонкой настройки доступа устройства: IOCTL Call
Call:
MAN 2 IOCTL
:
int ioctl(int d, unsigned long request, ...);
Может быть, есть для этого, но я не осознавать любой.
> strace fdisk -l /dev/sda
[...]
open("/dev/sda", O_RDONLY|O_CLOEXEC) = 3
[...]
ioctl(3, BLKGETSIZE64, 500107862016) = 0
[...]
ioctl(3, CDROM_GET_CAPABILITY or SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT, 0) = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(3, BLKALIGNOFF, 0) = 0
ioctl(3, BLKIOMIN, 4096) = 0
ioctl(3, BLKIOOPT, 0) = 0
ioctl(3, BLKPBSZGET, 4096) = 0
ioctl(3, BLKSSZGET, 512) = 0
ioctl(3, BLKSSZGET, 512) = 0
uname({sys="Linux", node="inno", ...}) = 0
ioctl(3, BLKGETSIZE64, 500107862016) = 0
ioctl(3, HDIO_GETGEO, {heads=255, sectors=63, cylinders=60801, start=0}) = 0