![带有多个引号的 Bash 别名](https://linux22.com/image/206677/%E5%B8%A6%E6%9C%89%E5%A4%9A%E4%B8%AA%E5%BC%95%E5%8F%B7%E7%9A%84%20Bash%20%E5%88%AB%E5%90%8D%20.png)
作为我工作流程的一部分,我倾向于ll
( alias ll='ls -l'
) 进入一个目录以查看我需要的文件是否在那里,然后,我cd
进入同一个目录来执行我必须执行的操作。
我想添加一个别名(或 bash 函数),它允许我具有与!!
或相同的功能sudo !!
。也就是说,如果我输入ll /mnt/Disc1/somedir
,并在该目录中找到我想要处理的文件,我希望能够只输入cd !!
(或类似的内容),这样如果我运行假设的cd !!
别名,这将改变ll
之前的命令,cd
同时保持绝对/相对路径,并使用 se 替换运行命令,这样现在我就在/mnt/Disc1/somedir
而不是之前所在的目录上。
下列的这个答案,我设法得到了一个工作版本:
cd "$(echo !-1 | awk '{print $2}')"
如果我在终端上运行它,它会完全按照我想要的方式执行(echo !-1
打印历史记录中的最后一个命令,即ll /mnt/Disc1/somedir
在将其通过管道传递给awk '{print $2}'
它之后打印第二列,即/mnt/Disc1/somedir
,所以这成为命令的参数/参数cd
)。
我的问题是为此命令定义一个别名。
功能
我遇到的大多数答案都建议使用函数作为解决方案(例如这里), 尽管这个答案,在功能部分之后,建议使用字面引号。有那么一刻,我以为这可以解决我的问题,但我无法让它发挥作用。我对函数的主要问题是,我似乎无法找到一种方法来使该!-1
部分工作,而无需我必须显式键入路径作为函数的参数。
引用转义
从我读到的内容来看(主要是这和这),我相信,如果我能理解转义引号的正确方法,那么我应该能够拥有我想要的别名的工作版本。我找到的答案的问题在于,它们没有解释转义引号(或特殊符号)的正确方法,也没有指出一个很好的参考来学习如何做到这一点(就像这个给出了很多例子但没有足够的解释让我学习正确的方法)。他们只是针对手头的情况进行工作,或者举例说明我无法适应我的情况。
作为替代方案,我尝试使用 cut 命令(而不是 awk)来尝试绕过该{print $2}
部分周围的单引号。但正如你所想象的,为了定义不同的分隔符,我必须使用引号......
编辑 正如所指出的在这个答案中,我试图以错误的方式解决这个问题。请参阅@frabjous 评论以获取可行的解决方案。
答案1
与之伴随的!!
是!$
-- 上一个命令的最后一个参数。
ll /some/dir
cd !$
看9.3 历史扩展在手册中
在别名中使用它:链接的手册部分说
读取完整行后,在 shell 将其分解为单词之前,立即执行历史扩展
之后别名被替换,如中所述3.1.1 外壳操作
- 将输入分解为单词和运算符,遵循引用中描述的引用规则。这些标记由元字符分隔。别名扩展是通过此步骤执行的(请参阅别名)。
鉴于上述陈述,我不知道是否有可能在别名中进行历史扩展。函数可以为您提供所需的所有灵活性:
lcd() {
local ans
ll "$1"
read -rp "cd there? [Y/n] " ans
if [[ ${ans,,} != n* ]]; then
cd "$1"
fi
}
调整该功能的用户界面以适合您的口味。