bash - 如何转义单引号作为别名复合命令的一部分?

标签 bash shell alias

我想创建一个别名,用于我的项目并自动切换到最新的候选版本分支,按照惯例,该分支具有以下模式: crel_1.0.1。为此,我在 .bashrc 中定义了以下别名,但由于缺少转义 awk 命令的单引号部分,我在别名启动或运行期间出现错误。我尝试过在外面使用双引号,但我也遇到错误。我尝试使用 '\'' 方法进行转义,但也遇到错误。

alias candidate='cd $PROJECT_HOME && git checkout . && git clean -fd && export CREL_BRANCH=`git branch --list crel* | awk '{ print $NF }'` && git checkout $CREL_BRANCH && git pull'

有问题的子命令如下,它位于波浪号内,然后我不知道如何转义:

export CREL_BRANCH=`git branch --list crel* | awk '{ print $NF }'`

启动新 shell 时出现以下错误:

bash: alias: print: not found
bash: alias: }` && git checkout $CREL_BRANCH && git pull: not found

运行别名时出现另一个错误:

> bash: unexpected EOF while looking for matching ``'
bash: syntax error: unexpected end of file

我需要 awk 位来获取输出的最后一个单词,该单词对应于我感兴趣的分支名称。

有什么想法可以解决这个问题吗?

最佳答案

您已经进入了使用别名不再有意义的领域 - 您的代码太大而无法成为一行代码。

建议使用函数是一个很好的建议。只需将您的别名替换为:

candidate () {
    cd $PROJECT_HOME || return
    git checkout . 
    git clean -fd 
    export CREL_BRANCH=`git branch --list crel* | awk '{ print $NF }'`
    git checkout $CREL_BRANCH
    git pull
}

但是,除非 CREL_BRANCH 变量导出对您很重要,否则我建议您创建一个脚本。

如果您还没有,请在 $HOME 中创建一个 bin 目录来存储您的所有个人脚本:

mkdir ~/bin

将此目录添加到您的$PATH:

export PATH=$PATH:~/bin

然后创建一个名为 candidate 的文件并使其可执行:

touch ~/bin/candidate
chmod +x ~/bin/candidate

编辑候选文件:

#! /bin/bash

cd $PROJECT_HOME || exit
git checkout . 
git clean -fd 
CREL_BRANCH=`git branch --list crel* | awk '{ print $NF }'`
git checkout $CREL_BRANCH
git pull

脚本更易于维护且更易于修改。脚本的唯一问题是它在子 shell 中运行,因此您无法从脚本中导出任何变量。

如果需要导出变量,请使用函数。不过,我建议将该函数保存在另一个文件中,例如 candidate.sh,然后在 bashrc 中添加:

# Import candidate function (note the space after the dot!)
. /path/to/candidate.sh

关于bash - 如何转义单引号作为别名复合命令的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68572691/

相关文章:

bash - bash 子 shell 会产生一个新的 `bash` 进程吗?

linux - 如何遍历 shell 命令的输出?

mongodb - 如何在 MongoDB Shell 中定义别名?

c# - list[i] 是 C# 中 list.get_item(i) 的别名吗?

sql - PostgreSQL 中函数的列别名

linux - Bash shell 参数传递...?

bash - GNU 并行不生成作业

linux - 返回 sg 设备大小的 shell 命令 (Linux)

linux - Shell:如果 a 小于 b, "a -lt b"是否不表示为真?

exec 命令上的 Linux shell 脚本语法错误