Answers:
别名就像命令一样,它们的所有参数都作为参数传递给别名的程序。例如,如果您要别名ls
为ls -la
,则键入ls foo bar
将真正ls -la foo bar
在命令行上执行。
如果要实际控制参数的解释方式,则可以编写如下函数:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
别名解决方案
如果您真的反对使用函数本身,则可以使用:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
如果只需要第一个参数$@
,$1
则可以替换为。
说明
这将创建一个临时函数f
,该函数将传递参数。
别名参数仅在最后传递。请注意,f
该别名在别名的最末端被调用。
当unset -f
执行别名时,remove会删除函数定义,因此以后不会挂起。
wrap_args x y z
给我:bash:意外标记'('附近的语法错误
f
别名了。一旦我没有混淆,f
它就可以正常工作。旧名称冲突的东西。
command type f
:)
除了当前的答案外,要了解别名的工作原理,重要的一点是,在别名命令之后键入的所有参数都将在字面上最后使用。因此,无法对两个命令(是否管道)使用别名,第一个命令应该从别名中解释参数。为了清楚起见,下面是一个无法正常工作的示例:
alias lsswp="ls -l | grep swp"
(一个例子的启发这个问题),这将始终使用的输出ls -l
在所进行的当前目录,并做一个的grep -因此使用
lsswp / tmp /
等同于ls -l | grep swp /tmp/
而不是 ls -l /tmp/ | grep swp
。
出于各种目的,应在中间的某个位置使用参数,则需要使用a function
代替alias
。
我在回答csh:
是的,您可以在别名中使用参数,并且-与上面所说的不同-您可以在别名的定义中的任何地方引用它们-不仅可以在末尾引用。
tar-gz -ing的示例:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
,其中!:1
和!:2
是调用别名时将提供的参数。
使用示例:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
这实际上意味着您使用了在tar命令的任意位置插入的两个参数,使所有参数成为别名 tgz
sh
已定义my_program_wrapper() { ...; }
。Bash可以处理关键字,function
但是为什么不选择更便携的工具呢?