别名在 bash shell 脚本中不起作用

别名在 bash shell 脚本中不起作用

当我在系统中搜索 .bashrc 文件时,我得到:

/etc/bash.bashrc
/etc/skel/.bashrc
/root/.bashrc
/usr/share/base-files/dot.bashrc

我变了:

/etc/bash.bashrc   
/root/.bashrc

我添加了别名。

alias urldecode='python -c "import sys, urllib as ul; \
    print ul.unquote_plus(sys.argv[1])"'

alias urlencode='python -c "import sys, urllib as ul; \
    print ul.quote_plus(sys.argv[1])"'

当我运行命令时:

urlencode 'http://example.com space'

它可以从命令行正常工作,但是当我创建一个.sh文件并在其中输入相同的命令时,我得到:

./tf.sh: line 19: urlencode: command not found

怎么了?

文件内容tf.sh

IP=$(curl -d "tool=checurl"-X POST https://site.com/get.py)
url='https://site.com.com/'
path=$(grep -oP '(?<=get.py\?filetype=csv\&data=).*?(?=\")' <<< $IP)
pathfull="get.py?filetype=csv&data=$path"

full=$url$pathfull

#echo $full

urlencode '$full'

答案1

一些评论:

  1. 编写 bash shell 脚本时,您需要使用以下命令启动脚本:

    #!/bin/bash
    
  2. 有一个已知问题 - 为什么我的 Bash 脚本无法识别别名?- 该 bash 脚本无法识别别名。

解决该问题的一个选择是:

在脚本的开头(之后#!/bin/bash)添加:

shopt -s expand_aliases

以下是source带有别名的文件:

source /etc/bash.bashrc

答案2

Bash 别名通常不会在非交互式shell(脚本)而且,你真的不应该依赖别名在你的脚本中!

将来,你会在另一台机器上需要这个脚本,你会忘记别名,而且它不起作用,您将浪费时间调试该问题!

创建脚本以直接使用所需的命令。或者为复杂或多行命令创建函数。或者更好的是,创建一个包含您需要的常用函数的“库”脚本,然后包含在你的脚本上。

bash也就是说,调用所有导出别名的脚本的一个简单方法是通过以下标志通过交互式会话调用它-i

$> bash -i ./tf.sh

根据评论进行编辑

脚本的简单bash函数包装器python将是:

function urldecode {
    PYTHON_ARG="$1" python - <<END
        import sys, urllib as ul
        print ul.unquote_plus(os.environ['PYTHON_ARG'])
    END
}

答案3

在别名中使用“python2”而不是“python”。对我来说,它非常有效。

alias urldecode='python2 -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'

相关内容