以下是需要实现的功能:
我想要运行以下操作:
mongodb bin/mongod
我的bash_profile文件中有以下内容:
alias = "./path/to/mongodb/$1"
别名将扩展为它所代表的字符串。别名后面的任何内容都会在其扩展后出现,无需作为显式参数传递或能够传递(例如$1
)。
$ alias foo='/path/to/bar'
$ foo some args
将会被扩展为
$ /path/to/bar some args
$ foo () { /path/to/bar "$@" fixed args; }
$ foo abc 123
将被执行,就像你已经完成了一样。
$ /path/to/bar abc 123 fixed args
unalias foo
unset -f foo
查看每个已定义的别名、关键字、函数、内置命令或可执行文件的类型和定义:
type -a foo
type -t foo
使用别名中的参数,我使用以下方法:
alias myalias='function __myalias() { echo "Hello $*"; unset -f __myalias; }; __myalias'
它是一个自毁函数嵌套在别名中,因此它几乎是最好的两个世界,并且不会占用您定义中的额外行...这让我很讨厌,哦对了,如果您需要返回值,则必须在调用unset之前存储它,然后在那个自毁函数中使用“return”关键字返回值:
alias myalias='function __myalias() { echo "Hello $*"; myresult=$?; unset -f __myalias; return $myresult; }; __myalias'
所以...
如果你需要在其中有那个变量,你可以这样做。
alias mongodb='function __mongodb() { ./path/to/mongodb/$1; unset -f __mongodb; }; __mongodb'
当然...
alias mongodb='./path/to/mongodb/'
实际上,即使没有参数,也可以执行同样的操作,但是如果你想要或需要一些参数(例如,你需要$2而不是$1),你就需要使用像这样的包装器。如果代码超过一行,你可能会考虑直接编写一个函数,因为随着代码变得越来越长,它会变得更加难以阅读和维护。函数非常好用,因为你可以获得所有函数提供的好处(在bash手册中查看完成、陷阱、绑定等好东西)。
希望这能帮到你 :)
通常当我想在Bash中传递参数给别名时,我使用别名和函数的组合,例如:
function __t2d {
if [ "$1x" != 'x' ]; then
date -d "@$1"
fi
}
alias t2d='__t2d'
__t2d
定义为函数,为什么还要取别名呢?为什么不把函数命名为t2d
并跳过取别名的步骤呢? - Mark E. Haase这是一种可以避免使用函数的解决方案:
alias addone='{ num=$(cat -); echo "input: $num"; echo "result:$(($num+1))"; }<<<'
测试结果
addone 200
input: 200
result:201
return
失败。将别名包装在函数中意味着return
始终成功执行。感谢您提供的解决方案。如果您提供一个钱包地址,我会用BCH给您小费。 - Lubo Kanevalias print 'lpr \!^ -Pps5'
print memo.txt
符号\!^
会将参数插入命令的此处。
!
字符前面加上\
,以防其被解释为历史命令。
您也可以传递多个参数:
alias print 'lpr \!* -Pps5'
print part1.ps glossary.ps figure.ps
function __GetIt {
cp ./path/to/stuff/$* .
}
alias GetIt='__GetIt'
unset -f foo
- Dennis Williamson