Интересно, можно ли выполнять цепные действия в терминале Ubuntu, например:
action 1 on objectA . then action 2 on objectA
без необходимости повторять имя объекта A больше.
Пример:
touch file.js && openEditor "$1"
или что-то типа того.
command-line
bash
HoCo_
источник
источник
&
отправим команду «touch» на задний план. Если вы намеревались «открыть редактор, если касание&&
Ответы:
С помощью bash History Expansion вы можете ссылаться на n-е слово текущей командной строки, используя,
!#:n
например,источник
GNU bash, version 4.3.48(1)-release
touch foo bar && ls -l !#:1-2
!
персонаж вводит выражение расширения истории, когда вы находитесь в интерактивной оболочке - он предназначен для манипулирования командной строкой на лету во время ввода текста и отключен в неинтерактивных сценарияхarg1=file.js; touch "$arg1" && openEditor "$arg1"
Существует удобный ярлык для общего случая использования. В вашем примере вы делаете:
Во второй команде хитрость заключается в написании
openEditor
(с пробелом после него), за которым следует Alt+ .. Это вставит последний аргумент последней команды, то естьfile.js
. (Если Altпо какой-то причине это не сработает , Escдолжно сработать.)Поскольку часто «объект» действительно является последним аргументом предыдущей команды, его можно часто использовать. Он легко запоминается и быстро интегрируется в набор интуитивно понятных сочетаний клавиш.
Существует целый ряд вещей, которые вы можете сделать с этим, вот подробная статья о возможностях: /programming/4009412/how-to-use-arguments-from-previous-command .
В качестве бонуса это будет работать не только в bash, но и во всех программах, которые используют libreadline для обработки ввода командной строки.
источник
Alt
и нажмите2.
(илиEsc
,2
,Esc
,.
), чтобы получить второе место до последнего аргумента нажмитеAlt
+-
, тип2
и нажмитеAlt
+.
(илиEsc
,-2
,Esc
,.
).echo 1 2 3 4
тогда, я хочу2
и3
для следующей командыAlt
и тип2.
, нажмите пробел, удержаниеAlt
и типа3.
- если вы хотите , диапазон, использование раскрывание истории:!!:2-3
.Что касается интерактивной оболочки по умолчанию
bash
и оболочки сценариевdash
, вы можете использовать ее$_
для вызова последнего аргумента последней команды .У csh и tcsh есть ссылки на историю, особенно для последнего слова команды, которое вы можете использовать
!$
, а для отдельных аргументов -!:<index>
:В общем, просто лучше присвоить
objectA
переменной что угодно , и использовать ее в нескольких командах, циклах и т. Д. В качестве альтернативы можно выбрать функцию:источник
$_
работает немного иначе, чем то,!#:n
как последний расширяется перед сохранением команды в истории. Таким образом, возвращение в историю покажет команду, в которой$_
время!#:n
будет заменено ее фактическим значением. У обоих есть свои плюсы и минусы.$_
следует заключать в кавычки, так как в противном случае он разбивается и сжимается, как все остальное. (Мы просто не видим его здесь, посколькуecho
объединяем его аргументы с одним пробелом.) Но, напримерtouch "hello there"; ls -l $_
, не будет работать.$_
том, что он портативный. В конце концов,!#:n
это специфично для bash.Я бы рекомендовал против исторического подхода, приведенного в ответе Steeldriver . Это зависит от глобального состояния, которое всегда хрупкое.
Лучше выполнить предварительный цикл по всем необходимым командам, используя правильную переменную:
В общем, небольшая проблема в том, что Bash не прерывает работу при сбое, то есть он ведет себя как
touch foo.txt; gedit foo.txt
цепочка, а не как цепочка&&
. Итак, для безопасности вы можете добавитьbreak
:источник
При приготовлении однострочника я иногда назначаю свою повторяющуюся вещь переменной оболочки, которую я использую в команде несколько раз. Я могу вспомнить и отредактировать его, чтобы использовать другой аргумент со стрелкой вверх, control + a, control + стрелка вправо, чтобы приблизить курсор к
t=
.Обратите внимание, что это облегчает привязку к расширению или изменению имени.
Также обратите внимание, что мне нужно
;
после присвоения переменной, потому чтоvar=value cmd
просто устанавливает это как переменную среды для этой команды, и не влияет на контекст оболочки.источник