3

Можно ли запускать последовательные команды с последующими ссылками на параметры, передаваемые самой первой?

Например, download, untar и cd:

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

Вместо этого сделайте:

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

Единственный способ, которым я могу думать об этом, - это ссылаться на него как на переменную. Есть ли другое решение?

5 ответов5

4

$_ может сделать трюк:

koke@escher:~$ mkdir test && cd $_ && echo $_
test
koke@escher:~/test$
2

Поэтому, чтобы расширить ответ Хорхе Бернала , вы также можете использовать расширение параметров:

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

который скинет ".tar.gz"

1

Не то, что вы просили, но, может быть, это достаточно близко для вас. В bash Meta+ _ (подчеркивание Meta +) выдаст вам последний параметр предыдущей команды. Итак, вы можете сделать:

$ 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.

Это проще сделать, чем объяснить, к сожалению.

Мой Alt- ключ сопоставлен с Meta (по умолчанию на большинстве терминалов в linux), поэтому его очень легко набирать.

Наконец, Meta+_ принимает числовой аргумент, поэтому вы можете набрать Meta+2 Meta+_, чтобы получить второй параметр предыдущей команды в текущей позиции курсора.

1

Кстати, вам лучше использовать dtrx для извлечения архивов за один раз. Таким образом, грязные архивы не будут загромождать ваши каталоги. Другие альтернативы: atool, 7z, unp и e. Большинство из них через Reddit.

0

Последняя часть сложна, потому что папка внутри архива, вероятно, не имеет такого же имени, как архив (superuser.tar.gz), поэтому, если папка внутри также не называется superuser.tar.gz, вам нужно будет использовать basename или аналогично удалению расширения .tar.gz. Однако если вы знаете имя каталога, вы можете просто указать его в командной строке.

В остальном все просто. Отправьте вывод Wget в stdout, затем передайте его в tar:

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

Если вы знаете название каталога внутри архива:

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .