在变量中使用函数的 Bash 别名

问题描述 投票:0回答:2

我不明白这里发生了什么。

我试图实现的目标:

当我拨打别名时我想要

  • 输出谁在哪里调用了这个,就像 CLI 一样
  • 输出别名后面的实际命令
  • 执行别名后面的命令。

示例:

# 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 中,然后在别名中使用它?

linux bash alias
2个回答
1
投票

不要。完全可以将变量中的字符串作为命令运行,但除非非常谨慎地执行,否则“出于安全原因,这是非常糟糕的做法”。相反,将命令存储为函数(您可以有条件地重新定义和更新,就像更新变量一样)。 # 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



0
投票

alias FOO='eval "echo ${__PREFIX}"; echo "${FOO}"; eval "${FOO}"'

© www.soinside.com 2019 - 2024. All rights reserved.