我对/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)'
然后用
更新了profile.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表现得那样。
答案 0 :(得分:2)
bash
中的别名不接受任何形式的参数。保存疼痛并使用功能。
function lnn() {
sed -n "${1}p" < "${2}"
}
在从命令行调用函数之前,将函数添加到文件00-alias.sh
并获取一次。
source /etc/profile.d/00-alias.sh
lnn 4 test.txt
在BashFAQ/80: How can I make an alias that takes an argument?
上查看更多信息你不能。 bash中的别名非常简陋,并不适合任何严肃的目的。 bash手册页甚至如此明确地说:
摘自GNU bash man
page,关于别名
..在替换文本中没有使用参数的机制。如果需要参数,则应使用shell函数。
另一方面,问题与相对路径(或)无关,因此,只需记住脚本中允许不的别名。它们只允许在交互式shell中使用。如果您正在编写脚本,请始终使用函数。