我有两个别名(显然被掩盖了):
alias ki='kinit -kt ~/.keytab alexdodd@box'
alias pt='function _pritunl() {/Applications/Pritunl.app/Contents/Resources/pritunl-client start 0e7e534335bsdfds6eaeb8e023a5ce4 --password XXXX$1; echo attempting pritunl login };_pritunl'
我天真地认为我可以将它们链接在一起,这样它们就会像这样一个接一个地运行:
alias ptki='function _ptki() {
pt $1
ki
if [ "$DEV_STACK_NAME" -ne 1 ]; then
echo "Starting devstack"
devstack start
fi
}'
然而,arg $1 永远不会传递到别名 pt (获取解析错误)`,我知道我是个白痴,但我在这里错过了什么,尝试搜索,但我觉得我们是如此基础,我不是确定我在寻找什么。
显然我从来没有碰过bash脚本=/添加到我需要学习的一长串内容中
我想使用别名“ptki”,依次运行三个别名,ptki 应该采用一个参数并将其传递。
第一个接受一个 arg 并将其传递给别名。第二个需要在第一个之后等待 10 秒。第三个仅在 DEV_STACK_NAME 存在时运行。
答案1
首先,出于可读性和可维护性的原因,您最好不要在函数定义中使用任何别名作为“快捷方式”,也因为您最好不要使用其他地方定义的别名来妨碍自己,这些别名可能会在您不记得甚至不知道的情况下发生变化它们最初是在函数或脚本中出于不同的意图而实现的。
其次,如果您必须坚持在脚本/函数中使用别名,则bash
联机帮助页会告诉您别名不会在非交互式 shell(例如脚本)中扩展。如果您希望它们在其中扩展,则需要添加shopt -s expand_aliases
脚本和source
定义这些别名的文件(通常为~/.bashrc
或~/.bash_aliases
),以便它们在脚本内启动。
对我来说,~/.bashrc
在任何情况下从脚本内部进行采购都远非最佳,主要是因为我并不总是知道给~/.bashrc
定主机的系统上有什么。
如果您希望默认情况下能够从脚本内部使用调用 shell 别名,则需要任何一个BASH_ENV
在调用 bash shell 环境中定义环境变量,或者#!/usr/bin/bash -i
在脚本中用作shebang。请参阅并查找 有关如何使脚本 shell 交互的man bash
部分。BASH_ENV
但 (再次)这违背了良好的做法,这意味着您或其他人迟早会因为脚本中虚假使用别名而遇到麻烦。请改用函数。
因此,不解决您显示的小代码的内容,您应该在名为 的脚本中执行此操作的方式my_script
基本上是:
#!/usr/bin/bash
function _pritunl() {
/Applications/Pritunl.app/Contents/Resources/pritunl-client start \
0e7e534335bsdfds6eaeb8e023a5ce4 --password XXXX"$1"
echo "attempting pritunl login"
}
function _ptki() {
_pritunl "$1"
kinit -kt ~/.keytab alexdodd@box
if [ "$DEV_STACK_NAME" -ne 1 ]; then
echo "Starting devstack"
devstack start
fi
}
_ptki "$1"
.. 然后使脚本 ( my_script
) 可执行并运行它,或者直接运行它:
$ bash my_script first_arg
其中first_arg
对应于$1
脚本中的第一个位置参数。
上面的脚本存在问题,列表中的第一个是 @roaima 在 OP 评论中指出的:这可能不是解决问题的正确方法。但如果是的话请记住您需要: