命令在终端中工作,但在配置文件中不能作为别名



我对/etc/profile.d/中的别名文件有问题。这不是什么重要的事情。我只是对为什么它没有按预期工作感兴趣。

所以基本上我在上面提到的路径上00-alias.sh文件,我想制作一个读取文件特定行的快捷方式。所以这是我的代码:

alias lnn='sed -n "${1}p" < "${2}"'

使用该代码,我应该能够执行类似

$ lnn 4 test.txt

但是,这不起作用。我只是得到错误

-bash: : No such file or directory


现在我想,好吧,也许相对路径不起作用,因为文件位于路径/etc/profile.d/00-alias.sh

所以我继续做了一个新的别名,比如

alias pwd2='echo $(pwd)'

然后更新了配置文件.d

source /etc/profile.d/00-alias.sh

只是尝试了pwd2但这与我目前所处的道路相呼应。所以理论上可以用我写的命令找到该文件。我仍然尝试将文件传递给具有绝对路径的别名,例如

$ lnn 4 /var/test.txt

仍然与上述错误相同。


但是,如果我在终端中输入别名的命令,例如

sed -n "4p" < test.txt

它工作得很好。无论我是否在test.txt周围加上引号


这是另一件奇怪的事情:如果我写

alias lnn='sed -n "${1}p" < ${2}'

没有引号${2}我得到错误

-bash: ${2}: ambiguous redirect

在终端中它工作得很好...

那么,我做错了什么?有人对此有想法吗?我很想知道我的错误。但正如我所说,这不是一个真正的问题,因为我只是好奇为什么 bash 会表现得那样。

bash中的别名不采用任何形式的参数。省去痛苦,改用函数。

function lnn() {
sed -n "${1}p" < "${2}"
}

将函数添加到文件00-alias.sh并获取一次,然后再从命令行调用函数。

source /etc/profile.d/00-alias.sh
lnn 4 test.txt

更多信息见 BashFAQ/80:如何制作接受参数的别名?

你不能。bash 中的别名非常简陋,并不适合任何严肃的目的。bash 手册页甚至如此明确地指出:

GNU bash man页面摘录,关于别名

..没有在替换文本中使用参数的机制。如果需要参数,则应使用 shell 函数。


附带说明一下,该问题与相对路径(或(无关,因此请记住,脚本中不允许使用别名。它们只允许在交互式外壳中。如果要编写脚本,请始终改用函数。

最新更新