带有多个引号的 Bash 别名

带有多个引号的 Bash 别名

作为我工作流程的一部分,我倾向于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 外壳操作

  1. 将输入分解为单词和运算符,遵循引用中描述的引用规则。这些标记由元字符分隔。别名扩展是通过此步骤执行的(请参阅别名)。

鉴于上述陈述,我不知道是否有可能在别名中进行历史扩展。函数可以为您提供所需的所有灵活性:

lcd() {
    local ans
    ll "$1"
    read -rp "cd there? [Y/n] " ans
    if [[ ${ans,,} != n* ]]; then
        cd "$1"
    fi
}

调整该功能的用户界面以适合您的口味。

相关内容