Board logo

标题: [技术讨论] 发觉 Linux Shell 下 alias 的一个缺陷:无法传递命令行参数? [打印本页]

作者: DOSforever    时间: 2024-6-1 23:14     标题: 发觉 Linux Shell 下 alias 的一个缺陷:无法传递命令行参数?

刚发觉 Linux Shell 下 alias 无法传递命令行后续的参数给所定义的命令,但这么说可能又不太确切。
比如 alias test=echo
然后我执行 test 123 ,是可以回显 123 的,这么说 test 不是把 123 作为参数传递给 echo 去执行了吗?
但是 alias 是不能像批处理那样把后续的参数传递给 %1 %2 等用的,有人说用 $1 $2 这样的形式,但实际试下来是没用的,alias 是不会把 $1 $2 像批处理的 %1 %2 那样作为参数传递给命令去执行的,
比如 alias test='echo $1 $2'
test 123 456
会回显 123 456 ,看上去似乎也对,但你如果这样执行
alias test='echo 123 $1 $2 456'
test abc def
并不会回显 123 abc def 456
而是回显    123 456 abc def
也就是 alias 并不会把 $1 $2 当作参数传递给 echo 去执行,alias test='echo $1 $1'alias test=echo 是一回事,这里 $1 $2 根本就没用。

只试过 bash 下 alias ,不知道其它 shell 下的表现如何。

有人说用先定义函数,然后在 alias 下调用该函数来实现 alias 的参数传递,不过我认为这太过于繁琐了,看来这是 Linux 下 alias 的一个不足。

作者: Five66    时间: 2024-6-2 00:28

额,alias又不是函数
命令
alias test='echo 123 $1 $2 456'
test abc def
不是相当于
echo 123 $1 $2 456 abc def
在$1 $2空的情况下,不就回显
123 456 abc def
作者: DOSforever    时间: 2024-6-2 00:42

回复 2# Five66


    什么叫又不是,本来就不是。alias 可以看作是一个批处理,一个单一行的批处理,4DOS / 4NT / Take Command 的 alias 就和批处理一样支持参数传递,很多简单的可以写在一行甚至多行但不长的批处理我就不专门写批处理文件了,而是写在 alias 中。
作者: Five66    时间: 2024-6-2 01:58

你都说alias不是了函数,却还想着alias能像函数那样传参,这不矛盾么?
再说了传参有函数就够了,真没必要特意弄alias
作者: ShowCode    时间: 2024-6-2 09:23

回复 1# DOSforever


There is no mechanism for using arguments in the replacement text, as in csh. If arguments are needed, use a shell function (see Shell Functions).
https://www.gnu.org/software/bash/manual/html_node/Aliases.html
作者: DOSforever    时间: 2024-6-2 09:55

你都说alias不是了函数,却还想着alias能像函数那样传参,这不矛盾么?
再说了传参有函数就够了,真没必要特意 ...
Five66 发表于 2024-6-2 01:58


    我一直不明白你为什么要把传递参数和函数这事捆绑起来?好像只有函数才能传递参数一样。批处理也不是函数,4DOS / 4NT / Take Command 中的 alias 也不是函数,不照样可以传递参数。Linux shell script 也不是函数,能传递参数吗?
作者: DOSforever    时间: 2024-6-2 10:04

回复  DOSforever
There is no mechanism for using arguments in the replacement text, as in csh. ...
ShowCode 发表于 2024-6-2 09:23


    是的,确实有人提到过如果要传递参数的话必须要用函数方式,由于我对 Linux shell 不是很熟,所以觉得不如其它命令行环境下的方便。谢谢你提供的资料!




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2