У bash (или любой оболочки, если на то пошло) есть режим «перезаписи»?

Я выполняю подобные команды на (например) наборе файлов. В качестве примера предположим, что я делаю что-то вроде этого (это не то, что я делаю, это просто пример):

> cat path/to/dir/file01.txt
  [file contents]
> another-command path/to/dir/file01.txt
  [more output]
> cat path2/to/dir/file02.txt
  [file contents, from which I can tell I should do something different]
> different-command path2/to/dir/file02.txt
  [yet more output]
> cat path3/to/dir/file03.txt
  [file contents]
> another-command path3/to/dir/file03.txt
  [output]

и т. Д.

It было бы удобно, если после использования & чтобы вернуться к предыдущей команде, я мог бы перезаписать не дублированный текст - например, имя файла или общую часть пути - вместо того, чтобы удалить его и повторить его.

Есть ли способ сделать это?

1
задан 26 June 2015 в 00:39

2 ответа

Не то, что вы просили напрямую, но вы можете использовать различные формы взаимодействия с историей для упрощения своей задачи:

$ cat path/to/dir/file01.txt
cat: path/to/dir/file01.txt: No such file or directory
$ different-command !$
different-command path/to/dir/file01.txt
bash: different-command: command not found
$ cat !$:s/1/2/
cat path/to/dir/file02.txt
cat: path/to/dir/file02.txt: No such file or directory
$ ^2^3
cat path/to/dir/file03.txt
cat: path/to/dir/file03.txt: No such file or directory
$ !-3:s/1/3/
different-command path/to/dir/file03.txt
bash: different-command: command not found
$ !diff:s/3/4/
different-command path/to/dir/file04.txt
bash: different-command: command not found

Игнорирование ошибок каждый раз, когда я использовал взаимодействие с историей (!$, [ f3], ^2^3), вы можете увидеть, как bash расширил его.

!$ - последнее слово предыдущей команды :s/1/2 - замените первое вхождение 1 на [ f9] в выбранном слове (в этом случае это было !$ снова). ^2^3 - заменить первое вхождение 2 на 3 во всей предыдущей команде. !-3 - выполнить команду третьего последнего. !diff - запустите последнюю команду, начатую с diff.
4
ответ дан 23 May 2018 в 19:29
  • 1
    Как вы говорите, не совсем то, что я собирался, но все же супер полезный (хотя мне, вероятно, придется тренироваться, чтобы использовать его немного за раз). – Wilson F 26 June 2015 в 20:33

Вы можете привязать ключ к директиве readline в $HOME/.inputrc.

"code": overwrite-mode

Чтобы обнаружить код, сгенерированный определенным ключом, нажмите CtrlandV вместе, затем нажмите этот ключ. Например, когда вы нажмете клавишу Ins (insert), вы увидите ^[[2~. Помните, что ^[ - это просто экранное представление для ESC, которое представлено с помощью \e для readline. Поэтому вы должны добавить следующую строку в $HOME/.inputrc:

"\e[2~": overwrite-mode

и перезапустить bash.

2
ответ дан 23 May 2018 в 19:29
  • 1
    Я поддержал это, потому что вы столкнулись с проблемой, и это правильно, но разве это не так, как принятый ответ? – Wilson F 3 March 2016 в 01:19
  • 2
    Да, только с некоторыми дополнительными сведениями о привязке любого выбранного ключа. – colemar 4 March 2016 в 12:15

Другие вопросы по тегам:

Похожие вопросы: