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