通常我有一个 .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
)