Можно ли заменить/изменить аргумент, используя bash bang (!) и историю

smartctl (доступный в smartmontools ) должен сделать это за вас.

1
09.02.2017, 22:09
2 ответа

Хохо, я рад, что есть еще кое-кто, кто интересуется этой древней особенностью. Я все еще использую его, но чаще всего использую стрелку вверх для вызова прошлых команд.

Двадцать пять лет назад у меня было \! как компонент моего PS1 , чтобы иметь возможность нумеровать прошлые команды и вызывать их, например, ! 54 . Не помню, когда решил, что это уже бесполезно ... Сейчас использую !! , ! - 2 , ! - 3 и прежде всего ! $ и ! $: H часто, но не очень более.

В любом случае, вы, кажется, спрашиваете о двух разных вещах:

  • Исправьте предыдущую команду:

     $ mv -r from to 
     $ !!: s / -r // 
    mv от до 
     

!: s / -r // можно использовать вместо !!: s / -r // . Модификатор s / / / заменяет первое вхождение на .

  • Адресная команда

     $ mv from to 
     $ echo!: 0 
    mv 
     
4
27.01.2020, 23:19

Что ж, вы можете упростить использование аргументов 2 и 3, как в этом примере:

$ echo -r movableFolder/ targetFolder/
-r movableFolder/ targetFolder/

$ echo !:2*
movableFolder/ targetFolder/

Все задокументировано в man bash:

Указатели слов Указатели слов используются для выбора нужных слов из события . A: отделяет спецификацию события от обозначения слова. Его можно опустить, если обозначение слова начинается с ^, $, *, - или%. Слова нумеруются с начала строки, при этом первое слово обозначается 0 (нулем).Слова вставляются в текущую строку через один пробел.

  0 (ноль) Нулевое слово. Для оболочки это командное слово. 
n n-е слово. 
 ^ Первый аргумент. То есть слово 1. 
 $ Последнее слово. Обычно это последний аргумент, но 
расширяется до нулевого слова, если в строке есть только одно слово. 
% Слово, совпадающее с последней строкой `? '?' поиск. 
x-y Диапазон слов; `-y 'сокращает` 0-y'. 
 * Все слова, кроме нуля. Это синоним для `1 - $ '. 
Использование *, если в событии только одно слово, не является ошибкой; 
в этом случае возвращается пустая строка. {{ 1}} x * Сокращает x - $. 
x- Сокращает x- $ как x *, но опускает последнее слово. 
 

Если указатель слова предоставляется без спецификации события, предыдущая команда используется как событие.

И поэтому после использования этой строки:

$ echo -r movableFolder/ targetFolder/
echo -r movableFolder/ targetFolder/

это будет работать:

$ !:0 !:2*
movableFolder/ targetFolder/

Также это:

$ !:0 !:2-$
movableFolder/ targetFolder/
4
27.01.2020, 23:19

Теги

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