gpt4 book ai didi

linux - 命令在终端中有效,但在 profile.d 中不作为别名

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:52 25 4
gpt4 key购买 nike

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

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

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

使用该代码我应该能够执行如下命令

$ lnn 4 test.txt

但是,这是行不通的。我只是得到了错误

-bash: : 没有那个文件或目录


现在我想,好吧,也许相对路径不起作用,因为文件位于路径 /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 会这样。

最佳答案

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?

You can't. Aliases in bash are extremely rudimentary, and not really suitable to any serious purpose. The bash man page even says so explicitly:

摘自 GNU bash man page , 关于别名

.. There is no mechanism for using arguments in the replacement text. If arguments are needed, a shell function should be used.


请注意,问题与相对路径 (or) 无关,因此请记住脚本中不允许 别名。它们只允许在交互式 shell 中使用。如果您正在编写脚本,请始终使用函数。

关于linux - 命令在终端中有效,但在 profile.d 中不作为别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45076529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com