Интересно, можно ли выполнять цепные действия в терминале Ubuntu, например:
action 1 on objectA . then action 2 on objectA
, не повторяя имя объекта A больше.
Пример:
touch file.js && openEditor "$1"
или что-то в этом роде.
С Расширением Истории удара можно обратиться к энному слову текущего использования командной строки !#:n
например.
$ touch foobar && ls -l !#:1
touch foobar && ls -l foobar
-rw-rw---- 1 steeldriver steeldriver 0 Jun 20 14:54 foobar
$ touch foo bar && ls -l !#:2
touch foo bar && ls -l bar
-rw-rw-r-- 1 steeldriver steeldriver 12 Jun 20 14:58 bar
Существует удобный ярлык для случая общего использования. В Вашем примере Вы делаете:
$ touch file.js
$ openEditor <alt>+<.>
Во второй команде должен записать прием openEditor
(с пространством после него) сопровождаемый Высоким звуком +.. Это вставит последний аргумент последней команды, которая является file.js
. (Если это не работает с Высоким звуком по некоторым причинам, Esc должен работать также.)
Так как часто "объект" является действительно последним аргументом предыдущей команды, это может часто использоваться. Это легко помнить и будет быстро интегрироваться в Ваш набор интуитивно используемых ярлыков оболочки.
Существует целый набор вещей, которые можно сделать с этим, вот всесторонняя статья о возможностях: https://stackoverflow.com/questions/4009412/how-to-use-arguments-from-previous-command.
В качестве награды это будет работать не только в ударе, но и во всех программах, которые используют libreadline для обработки входа командной строки.
До интерактивной оболочки по умолчанию bash
и сценарии оболочки dash
идет, можно использовать $_
вспоминать последний аргумент последней команды.
$ echo "Hello World"; echo same "$_"
Hello World
same Hello World
csh и tcsh имеют ссылки истории, специально для последней команды, можно использовать !$
, и для отдельных аргументов - !:<index>
:
~% echo foo bar
foo bar
~% echo !$
echo bar
bar
% echo bar baz
bar baz
% echo !:1
echo bar
bar
В целом просто лучше присвоить то независимо от того, что objectA
к переменной и использованию это в нескольких командах, циклах, и т.д. С другой стороны, функция могла быть выбором:
$ foo(){ echo "$@"; stat --print="%F\n" "$@";}
$ foo testdir
testdir
directory
Я рекомендовал бы против подхода истории, данного в ответе steeldriver. Это полагается на глобальное состояние, которое является всегда хрупким.
Лучше должен заранее циклично выполниться по всем необходимым командам, с помощью надлежащего variabe:
$ for c in touch gedit; do $c foo.txt; done
Что является определенной проблемой, в целом то, что Bash не прерывается, когда существует отказ, т.е. это на самом деле ведет себя как touch foo.txt; gedit foo.txt
вместо того, чтобы объединить в цепочку с &&
. Так, для сейфа, можно добавить a break
:
$ for c in touch gedit; do $c foo.txt || break; done
При приготовлении остроты, я иногда присваиваю свою повторную вещь переменной оболочки, которую я использую многократно в команде. Я могу вспомнить и отредактировать его, чтобы использовать другой аргумент со стрелкой вниз, control+a, control+right-arrow получить курсор близко к t=
.
t=testloop; asm-link -d "$t.asm" && perf stat -r2 ./"$t"
Обратите внимание, что это помогает лавировать на расширении или вариации на имя.
Также обратите внимание, что мне нужен a ;
после переменного присвоения, потому что var=value cmd
просто наборы, что как переменная среды для той команды, и не влияет на контекст оболочки.