Как выполнить несколько команд, используя один и тот же аргумент?

Интересно, можно ли выполнять цепные действия в терминале Ubuntu, например:

action 1 on objectA . then action 2 on objectA 

, не повторяя имя объекта A больше.

Пример:

touch file.js && openEditor "$1" 

или что-то в этом роде.

15
задан 2 July 2018 в 01:06

5 ответов

С Расширением Истории удара можно обратиться к энному слову текущего использования командной строки !#: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
26
ответ дан 23 November 2019 в 02:38

Существует удобный ярлык для случая общего использования. В Вашем примере Вы делаете:

$ touch file.js
$ openEditor <alt>+<.>

Во второй команде должен записать прием openEditor (с пространством после него) сопровождаемый Высоким звуком +.. Это вставит последний аргумент последней команды, которая является file.js. (Если это не работает с Высоким звуком по некоторым причинам, Esc должен работать также.)

Так как часто "объект" является действительно последним аргументом предыдущей команды, это может часто использоваться. Это легко помнить и будет быстро интегрироваться в Ваш набор интуитивно используемых ярлыков оболочки.

Существует целый набор вещей, которые можно сделать с этим, вот всесторонняя статья о возможностях: https://stackoverflow.com/questions/4009412/how-to-use-arguments-from-previous-command.

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

12
ответ дан 23 November 2019 в 02:38

До интерактивной оболочки по умолчанию 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
9
ответ дан 23 November 2019 в 02:38

Я рекомендовал бы против подхода истории, данного в ответе 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
3
ответ дан 23 November 2019 в 02:38

При приготовлении остроты, я иногда присваиваю свою повторную вещь переменной оболочки, которую я использую многократно в команде. Я могу вспомнить и отредактировать его, чтобы использовать другой аргумент со стрелкой вниз, control+a, control+right-arrow получить курсор близко к t=.

t=testloop; asm-link -d "$t.asm" && perf stat -r2 ./"$t"

Обратите внимание, что это помогает лавировать на расширении или вариации на имя.

Также обратите внимание, что мне нужен a ; после переменного присвоения, потому что var=value cmd просто наборы, что как переменная среды для той команды, и не влияет на контекст оболочки.

1
ответ дан 23 November 2019 в 02:38

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

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