Shell:是否可以引用前面的参数?

Shell:是否可以引用前面的参数?

是否可以运行连续的命令,其中后面的命令引用传递给第一个命令的参数?

例如,下载、解压并 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

我能想到的唯一实现方法是将其作为变量引用。还有其他解决方案吗?

答案1

$_可能会奏效:

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

答案2

因此,为了扩展豪尔赫·伯纳尔答案,您也可以使用参数扩展:

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

这将删除“.tar.gz”

答案3

这不是你想要的,但可能对你来说已经足够接近了。在 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++2Meta_获取当前光标位置处上一个命令的第二个参数。

答案4

最后一部分比较棘手,因为存档中的文件夹可能与存档的名称不同(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

显然,这不是跨命令通用的,但是您想要通过“引用”实现的大部分功能都可以通过管道来完成。

相关内容