欢迎光临
我们一直在努力

在bash脚本中设置别名

本站教程收集整理的这篇文章主要介绍了在bash脚本中设置别名,本站教程本站觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试在脚本中创建一个别名,如下所示:

#!/bin/bash
shopt -s expand_aliases

#Currently just using 'git' to try and get it working
#It'll be replaced with the following line when it works
#compgen -c | while read x;
echo 'git' | while read x;
  do
    a=`echo $x | tr '[:lower:]' '[:upper:]'`;
    echo $a;
    echo $x;
    if [ "$a" != '' ]
    then
      echo 'got here';
      alias $a=$x;
      alias;
      GIT;
    fi
done

虽然一个简单的测试脚本可以工作(testme被添加到我当前sHell中的别名):

#!/bin/bash
shopt -s expand_aliases
alias testme="echo It Worked"
alias
testme

第一个脚本的输出:

GIT
git
got here
alias GIT='git'
alias grep='grep --colour=auto'
alias ls='ls --color=auto'
GIT: command not found

GIT显示在别名中,但无法执行.我试过用它来试试. ./script.sh和source script.sh.我究竟做错了什么?

解决方法

这可能是别名扩展时的问题. bash手册页有以下内容:

手册页中有更多信息,但在执行复合语句(例如while循环中的列表)时,将在首次读取输入时执行扩展,而不是在执行时进行扩展.由于在读取输入时未定义GIT,因此将出现错误.

以下代码段显示了此问题:

#!/bin/bash
shopt -s expand_aliases

while read x; do
    a=`echo $x |便宜美国vps tr '[:lower:]' '[:upper:]'`
    alias $a=$x
    GIT   # <--- this fails to execute git
done < <(echo 'git')

GIT # <--- this executes git

一旦执行了while循环,则别名变为可用.手册页中的详细信息有点粗略,但似乎适用于函数中定义的别名注释.

另外,使用echo foo |等语法时要小心读x;做东西;完成. while循环将在子sHell中执行,子sHell中所做的任何更改都不会超出while循环.上面的示例显示了一个方法,以便while循环在当前sHell中执行,但从执行的命令获取其输入.

更新:

如果上面的脚本是以原始形式编写的,它将如下所示:

#!/bin/bash
shopt -s expand_aliases

#Currently just using 'git' to try and get it working
#It'll be replaced with the following line when it works
#compgen -c | while read x;

echo 'git' | while read x; do
    a=`echo $x | tr '[:lower:]' '[:upper:]'`
    alias $a=$x
    GIT   # <--- this fails to execute git
done

GIT # <--- this also fails executes git because the alias' were set in a subsHell.

在这种情况下,别名永远不会执行.原因是管道|为一个新的子sHell加注星标并将这些过程链接在一起echo在一个进程中运行,while读取…在另一个进程中运行,由管道链接.设置别名后,它们将在运行while循环的子sHell的进程环境中设置.但是,当while循环结束时,该进程将终止并丢弃其环境,以及对其环境所做的任何更改,例如添加别名.结果,执行GIT的第二次尝试将失败,因为别名信息已被丢弃.

当您使用第一个脚本中显示的拓扑时,while循环在当前脚本中运行,因此对环境所做的任何更改都会在循环结束后保持不变.

如果您执行脚本而不是获取脚本,您还会注意到此行为.如果您希望能够在这样的脚本中配置一组别名,运行脚本,让它们在您的环境中可用,您遇到同样的问题,因为您的脚本在一个单独的进程中运行到父sHell,创建别名,当脚本退出时随后被丢弃.

$./create_aliases
$alias  # <--- Ooops,no aliases defined.

您必须像这样来源脚本,它将在当前进程中运行脚本的内容,从而修改当前环境.

$source ./create_aliases
$alias # <--- Yay,new aliases present.

这就是为什么bash将提供诸如?/ .bashrc之类的文件,以便您在该文件中所做的更改将存在于当前环境中.

本站总结

以上是本站教程为你收集整理的在bash脚本中设置别名全部内容,希望文章能够帮你解决在bash脚本中设置别名所遇到的程序开发问题。

如果觉得本站教程网站内容还不错,欢迎将本站教程推荐给好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。