Gostaria de saber se é possível fazer ações em cadeia no terminal Ubuntu como:
action 1 on objectA . then action 2 on objectA
sem ter que repetir o nome do objetoA mais.
Exemplo:
touch file.js && openEditor "$1"
ou algo assim.
command-line
bash
HoCo_
fonte
fonte
&
o comando "touch" será enviado em segundo plano. Se você pretendia "abrir o editor se toque bem-sucedido", então você quer&&
em vezRespostas:
Com o bash History Expansion , você pode consultar a enésima palavra da linha de comando atual usando,
!#:n
por exemplo,fonte
GNU bash, version 4.3.48(1)-release
touch foo bar && ls -l !#:1-2
!
introduz caracteres uma expressão de expansão história quando você está em um shell interativo - que está destinado para a manipulação de linha de comando on-the-fly como você está digitando, e é script não-interativo desativado dentroarg1=file.js; touch "$arg1" && openEditor "$arg1"
Há um atalho útil para um caso de uso comum. No seu exemplo, você está fazendo:
No segundo comando, o truque é escrever
openEditor
(com um espaço depois) seguido de Alt+ .. Isto irá inserir o último argumento do último comando, que éfile.js
. (Se não funcionar Altpor algum motivo, também Escdeve funcionar.)Como frequentemente o "objeto" é realmente o último argumento do comando anterior, isso pode ser usado com freqüência. É fácil de lembrar e se integrará rapidamente ao seu conjunto de atalhos de shell usados intuitivamente.
Há várias coisas que você pode fazer com isso. Aqui está um artigo detalhado sobre as possibilidades: /programming/4009412/how-to-use-arguments-from-previous-command .
Como um bônus, isso funcionará não apenas no bash, mas em todos os programas que usam libreadline para processar a entrada da linha de comando.
fonte
Alt
e pressione2.
(ouEsc
,2
,Esc
,.
), para obter o segundo ao último argumento de imprensaAlt
+-
, tipo2
e pressionarAlt
+.
(ouEsc
,-2
,Esc
,.
).echo 1 2 3 4
, então eu quero2
e3
para o próximo comandoAlt
e tipo2.
, pressione a barra de espaço, esperaAlt
e tipo3.
- se você quiser um intervalo, a expansão histórico de uso:!!:2-3
.No que diz respeito ao shell interativo padrão
bash
e ao shell de scriptdash
, você pode usar$_
para recuperar o último argumento do último comando .csh e tcsh têm referências de histórico, especificamente para a última palavra do comando, você pode usar
!$
e para argumentos individuais -!:<index>
:Em geral, é melhor atribuir o que quer que seja
objectA
a uma variável e usá-lo em vários comandos, loops etc. Como alternativa, uma função pode ser uma opção:fonte
$_
funciona de maneira um pouco diferente do que!#:n
quando o último é expandido antes de salvar o comando no histórico. Então, voltar ao histórico ainda mostraria o comando com$_
while!#:n
teria sido substituído por seu valor real. Ambos têm seus prós e contras.$_
deve ser citado; caso contrário, ele será dividido e globulado como tudo o resto. (Nós simplesmente não o vemos aqui, poisecho
une seus argumentos a um único espaço.) Mas, por exemplotouch "hello there"; ls -l $_
, não funciona.$_
é que é portátil. Afinal,!#:n
é específico do bash.Eu recomendaria contra a abordagem da história dada na resposta da steeldriver . Isso depende do estado global, que é sempre frágil.
Melhor é fazer um loop inicial de todos os comandos necessários, usando uma variável adequada:
O que é um pouco problemático em geral é que o Bash não aborta quando há uma falha, ou seja, isso realmente se comporta como em
touch foo.txt; gedit foo.txt
vez de encadear&&
. Portanto, para estar seguro, você pode adicionar umbreak
:fonte
Ao preparar uma linha, às vezes atribuo minha coisa repetida a uma variável de shell que uso várias vezes no comando. Lembro-me e editá-lo para usar um argumento diferente com seta para cima, controle + a, controle + seta para a direita para aproximar o cursor do
t=
.Observe que isso facilita a aderência a uma extensão ou uma variação no nome.
Observe também que preciso de uma
;
atribuição após a variável, porquevar=value cmd
apenas define isso como uma variável de ambiente para esse comando e não afeta o contexto do shell.fonte