我不明白这里发生了什么。
我试图实现的目标:
当我拨打别名时我想要
示例:
# The prefix to be re-used.
__PREFIX='$(whoami)@$(hostname):$(pwd)\$'
# The commands to execute in a var to be able to print them too.
FOO="echo 'foo' && echo 1"
BAR="echo 'bar' && echo 2"
BAZ="echo 'baz' && echo 3"
# Define aliases
# echo the prefix and the command that will be executed,
# and the execute the commands.
alias FOO='echo ${__PREFIX}'" '${FOO}' && ${FOO}"
alias BAR='echo ${__PREFIX}'" '${BAR}' && ${BAR}"
alias BAZ='echo ${__PREFIX}'" '${BAZ}' && ${BAZ}"
我发现我必须在单引号中使用
$(pwd)
'
来调用它,而不是将其“打印”到别名中。
上面的
FOO
示例打印:
username@notebook:~$
$(whoami)@$(hostname):$(pwd)\$ echo foo && echo 1
foo
1
当我将
FOO
示例更改为
alias FOO='echo $(whoami)@$(hostname):$(pwd)\$'" '${FOO}' && ${FOO}"
然后就可以了:
username@notebook:~$
username@notebook:/home/username$ echo foo && echo 1
foo
1
问题:如何将 whoami、主机名和 pwd 放在 var 中,然后在别名中使用它?
不要。完全可以将变量中的字符串作为命令运行,但除非非常谨慎地执行,否则“出于安全原因,这是非常糟糕的做法”。相反,将命令存储为函数(您可以有条件地重新定义和更新,就像更新变量一样)。
# note that running hostname and whoami over and over is very inefficient; don't do this.
log_prefix() { printf '%s@%s:%s$ ' "$(whoami)" "$(hostname)" "$PWD"; }
log_cmd() { printf '%q ' "$@"; printf '\n'; }
log_and_run() { log_prefix; log_cmd "$@"; "$@"; }
如果您想以编程方式定义别名,则可以对函数执行相同的操作(尽管需要注意不要调用前面提到的安全问题):
# note that getting this wrong could cause serious security problems
# consequently, it's very carefully written; don't make changes without understanding them
wrap_cmd() {
local wrapper_name cmd_content def_cmd
wrapper_name=$1; shift
printf -v cmd_content '%q ' "$@"
printf -v def_cmd '%q() { log_and_run %s "$@"; }' "$wrapper_name" "$cmd_content"
eval "$def_cmd"
}
有了上面的定义,您可以将其用作:
$ wrap_cmd sayhi echo hello # create 'sayhi' to run 'hello world'
$ sayhi world # and test it! (below is output)
user@host:/home/user$ echo hello world
hello world
...即使在命令被包装后,您也可以重新定义
log_prefix
函数,就像您打算更新
__PREFIX
:$ log_prefix() { printf %s "NEW PREFIX HERE: "; }
$ sayhi world
NEW PREFIX HERE: echo hello
hello
alias FOO='eval "echo ${__PREFIX}"; echo "${FOO}"; eval "${FOO}"'