无法在脚本中使用别名,即使我在上面定义了它!

无法在脚本中使用别名,即使我在上面定义了它!

我有一个非常奇怪的情况...如果我使用 /bin/bash 运行脚本,它甚至无法识别我在脚本内设置的别名。而最奇怪的是

$ cat -n test.sh
    1 #!/bin/bash
    2 alias somecommand='ls -alF'
    3 alias
    4 somecommand
$ ./test.sh
alias somecommand='ls -alF'
./test.sh: line 4: somecommand: command not found

...如上所示,如果我在脚本中运行命令“alias”,结果表明 bash 已采取某个命令进入别名,但如果我运行某个命令本身它仍然不会被识别!

如果我使用命令“sh”运行脚本,一切都是正确的..那么这是bash的错误吗?或者我缺少什么?

任何帮助表示赞赏!

答案1

根本不使用脚本中的别名。在脚本中使用专为交互式使用而设计的功能没有什么意义。相反,使用函数:

somecommand () {
    ls -alF
}

函数比别名灵活得多。以下内容将ls使用始终执行的版本重载通常的版本ls -F(参数传入$@,包括您使用的任何标志),几乎与别名一样alias ls="ls -F"

ls () {
    command ls -F "$@"
}

这里command可以防止 shell 进入无限递归,否则它会这样做,因为该函数也被称为ls

别名永远无法做这样的事情:

select_edit () (
    dir=${1:-.}
    if [ ! -d "$dir" ]; then
        echo 'Not a directory' >&2
        return 1
    fi
    shopt -s dotglob nullglob
    set --
    for name in "$dir"/*; do
        [ -f "$name" ] && set -- "$@" "$name"
    done
    select file in "$@"; do
        "${EDITOR:-vi}" "$file"
        break
    done
)

这将创建一个函数select_edit,该函数将目录作为参数,并要求用户在该目录中选择一个文件。所选文件将在编辑器中打开进行编辑。

手册bash包含以下声明

对于几乎所有用途,别名都被 shell 函数取代。

答案2

要在 bash 脚本中使用别名等交互式功能,您必须在交互式 bash shell 中运行它。为此,更改第一行以包含-i.所以你的新脚本文件变成

#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand 

答案3

有点重复上一个问题然而那里的答案有点罗嗦。简而言之,由于神秘的原因,默认情况下 bash 不会查看脚本内定义的别名。您必须通过shopt -s expand_aliases所述脚本顶部的一行明确告诉它这样做。这样做然后你的脚本就会发现某个命令

答案4

shopt -sq expand_aliases例如,使用UTF-8 编码的以下代码:

#!/bin/bash

function запрещать() {
    if [ $1 -eq 3 ]
    then
        echo -n "Запрещено. Код ошибки: "
        echo `expr 2 \* 3 \* 47`
    else
        echo -n "."
        запрещать `expr $1 + 1`
    fi
}

#function запретить() {
#   запрещать 1
#}

shopt -sq expand_aliases
alias запретить='запрещать 1'

запретить

相关内容