Shell: É possível fazer referência ao parâmetro anterior?

3

É possível executar comandos consecutivos, com aqueles que seguem referenciando o (s) parâmetro (s) passado (s) ao primeiro?

Por exemplo, download, untar e cd:

wget superuser.tar.gz
tar -xzf superuser.tar.gz
cd ./superuser

Em vez disso:

wget superuser.tar.gz && tar -xzf $1 && cd $1
// with $1 being superuser.tar.gz

A única maneira de pensar nisso é referenciá-lo como uma variável. Existe outra solução?

    
por Hayek 08.01.2010 / 10:10

5 respostas

4

$_ pode fazer o truque:

koke@escher:~$ mkdir test && cd $_ && echo $_
test
koke@escher:~/test$
    
por 08.01.2010 / 13:37
2

Então, para expandir a resposta de Jorge Bernal , você também pode usar a expansão de parâmetros:

wget superuser.tar.gz && tar -xzf $_ && cd ${_%.tar.gz}

que removerá o ".tar.gz"

    
por 08.01.2010 / 14:11
1

Não é o que você pediu, mas talvez esteja perto o suficiente para você. No bash, Meta + _ (Meta + sublinhado) lhe dará o último parâmetro do comando anterior. Então, você pode fazer:

$ wget superuser.tar.gz
$ tar -xzf <Meta>-_
# In the above, I typed Meta-_, got superuser.tar.gz
$ cd ./ <Meta>-_<Meta>-2<Meta>-<backspace><backspace>
# In the above, I type Meta-_ to get superuser.tar.gz, then
# Meta-2 followed by Meta-backspace to delete
# two words, then backspace to delete the period.

Isso é mais fácil do que explicado, infelizmente.

Eu tenho minha chave Alt mapeada para Meta (padrão na maioria dos terminais no linux), então é muito fácil digitar.

Finalmente, Meta + _ usa um argumento numérico, então você pode digitar Meta + 2 Meta + _ para obter o segundo parâmetro do comando anterior na posição atual do cursor.

    
por 08.01.2010 / 10:28
1

A propósito, é melhor você usar o dtrx para extrair arquivos de uma só vez. Dessa forma, arquivos bagunçados não vão sobrecarregar seus diretórios. Outras alternativas: atool , 7z , unp e e . A maioria deles via reddit .

    
por 08.01.2010 / 15:38
0

A última parte é complicada porque a pasta dentro do arquivo provavelmente não tem o mesmo nome que o arquivo (superuser.tar.gz), então a menos que a pasta dentro também seja nomeada superuser.tar.gz, você precisará use basename ou similar para remover a extensão .tar.gz. Se você souber o nome do diretório, pode fornecê-lo na linha de comando.

O resto é fácil. Envie a saída do Wget para stdout e, em seguida, canalize-a para tar:

wget -O - superuser.tar.gz 2> /dev/null | tar xzvf -

Se você souber o nome do diretório dentro do arquivo:

wget -O - superuser.tar.gz 2> /dev/null | tar xzvf - && cd superuser

Isso não é universal entre os comandos, obviamente, mas a maior parte do que você deseja alcançar por meio da "referência" pode ser feita por meio da tubulação.

    
por 08.01.2010 / 10:32