如何在command_string中使用别名?

如何在command_string中使用别名?

通常我有一个 .bashrc 文件,其中 ll 别名设置为

alias ll='ls -l'

当我手动调用时ll,它工作得很好。但是,有时我可能需要从字符串运行命令。所以我想运行:

COMMAND="ll"
bash --login -c "$COMMAND"

不幸的是,这抱怨未找到 ll 命令并失败。如果我检查 alises 它确实是在此范围内定义的,我会这样检查:

COMMAND="alias"
bash --login -c "$COMMAND"

上面提到的正确打印我的所有别名。

有没有办法在 bash 的 -c command_string 参数中使用别名命令?

答案1

这里需要注意一些事情,首先是关于使用--login选项运行:

When bash is invoked as an interactive login shell, or as a non-inter‐
active shell with the --login option, it first reads and executes  com‐
mands  from  the file /etc/profile, if that file exists. After reading
that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
in  that order, and reads and executes commands from the first one that
exists and is readable.

所以,这个命令不会读取你的.bashrc.其次,别名仅在交互式 shell 中工作,因此即使获取了该别名,它也无法在您的命令中工作。然而,函数可以在非交互式 shell 中工作。因此,您应该将别名转换为函数,并将它们来源为上述之一,例如~/.bash_profile.

或者,您可以将当前环境中定义的函数导出到 继承的函数bash -c。我有这个功能:

adrian@adrian:~$ type fn
fn is a function
fn () 
{ 
    find . -name "$1"
}

我可以在子 shell 中调用它,如下所示:

adrian@adrian:~$ export -f fn
adrian@adrian:~$ bash -c "fn foo*"
./foo.bar

答案2

.bashrc仅在某些条件下读取,因此请执行以下操作:

$ cat ~/.bashrc
echo being read
alias foo='echo bar'
$ bash -c foo
bash: foo: command not found
$ bash -i -c foo
being read
bar
$ 

快速浏览一下bash(1)然后interactive可能会出现

   Aliases  are not expanded when the shell is not interactive, unless the
   expand_aliases shell option is set using shopt (see the description  of
   shopt under SHELL BUILTIN COMMANDS below).

-i除了扔进参数列表之外,它还可以提供其他几种方法来实现这一点。

(话虽这么说,我绝对不会在非交互式 shell 中使用别名,例如bash -c

相关内容