如何将单引号转义为别名复合命令的一部分?
How to escape single quotes as part of an alias composite command?
我想创建一个别名,用于我的项目并自动切换到最新的候选发布分支,按照惯例,该分支具有以下模式: 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 位来获取与我感兴趣的分支名称对应的输出的最后一个字。
有什么解决办法吗?
用 $( print $NF )
代替 '{ print $NF }'
怎么样?
所以你应该试试这个:
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'
您已经进入了使用别名不再有意义的领域 - 您的代码太大而无法成为一行代码。
推荐使用某功能,不错。只需将您的别名替换为:
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
编辑 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
我想创建一个别名,用于我的项目并自动切换到最新的候选发布分支,按照惯例,该分支具有以下模式: 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 位来获取与我感兴趣的分支名称对应的输出的最后一个字。
有什么解决办法吗?
用 $( print $NF )
代替 '{ print $NF }'
怎么样?
所以你应该试试这个:
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'
您已经进入了使用别名不再有意义的领域 - 您的代码太大而无法成为一行代码。
推荐使用某功能,不错。只需将您的别名替换为:
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
编辑 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