别名中bash函数的懒计算结果

Ste*_*nov 5 command-line bash alias bashrc

我想在 Ubuntu 中通过简单的命令在当前位置打开新的终端窗口

gnome-terminal --working-directory=`pwd` & disown
Run Code Online (Sandbox Code Playgroud)

工作对我来说很好。但是当我给 bashrc 加上别名时

alias clone="gnome-terminal --working-directory=`pwd` & disown "
Run Code Online (Sandbox Code Playgroud)

pwd开始计算。所以我得到了类似的东西。

$ type clone
 clone is aliased to `gnome-terminal --working-directory=/home/user & disown '
Run Code Online (Sandbox Code Playgroud)

是否可以pwd仅在我调用别名时进行计算。或者我需要编写除别名之外的 bash 函数?

hee*_*ayl 10

只需在alias声明命令周围使用单引号,以便在声明时pwd不会发生命令替换 ( )(并且仅在调用别名时才会扩展):

alias clone='gnome-terminal --working-directory=`pwd` & disown'
Run Code Online (Sandbox Code Playgroud)

也开始使用命令替换语法$()而不是旧的和有问题的``

alias clone='gnome-terminal --working-directory="$(pwd)" & disown'
Run Code Online (Sandbox Code Playgroud)

另请注意,gnome-terminal它的设计方式是,无论何时

gnome-terminal
Run Code Online (Sandbox Code Playgroud)

它将打开一个与原始窗口具有相同 PID 的新窗口。这是因为它的设计过程相同,退出一个不会杀死另一个。所以你不需要disown和背景 ( &),只需要:

alias clone='gnome-terminal --working-directory="$(pwd)"'
Run Code Online (Sandbox Code Playgroud)

会做。

此外,正如@Digital Trauma 所指出的,gnome-terminal始终从当前工作目录开始,因此--working-directory不需要,因为您将其设置为pwd. 所以你可以这样做:

alias clone='gnome-terminal' 
Run Code Online (Sandbox Code Playgroud)