gpt4 book ai didi

linux - 使用 bash one liner 创建别名

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:29 24 4
gpt4 key购买 nike

我需要为我的长命令创建别名,通常我会使用

alias myLongCommand="my long command"

但我需要在只能使用 bash 命令的在线系统配置中定义,我尝试了各种组合,包括:

bash -c 'alias myLongCommand="my long command"'

但不幸的是没有成功,别名没有被定义。

为了测试成功我使用

bash -c myLongCommand

最佳答案

简短回答:改用导出函数

# define a function
myLongCommand() { my long command; }

# export that function to the environment
export -f myLongCommand

# thereafter, that function is available in subprocesses
bash -c 'myLongCommand'

...或者,将实际创作压缩成一行:

myLongCommand() { my long command; }; export -f myLongCommand

请注意,定义和导出需要在 bash shell 中完成,该 bash shell 本身就是您打算在其中使用函数的 shell 的父进程。如果你使用 bash -c 'myLongCommand() { 我的长命令; }; export -f myLongCommand',那么具有导出函数的环境变量仅在该 bash -c 实例存在时存在 - 因此,它在任何后续命令中完全不可用。

如果您希望它对登录 session 中的所有 bash shell 都可用,您可以将定义和导出放在 ~/.bash_profile 中(然后注销并重新登录),如果您的系统在点文件初始化方面按照典型的默认值运行。

更长的答案:为什么最初的尝试失败了?

多种原因:

  • 别名是单个 shell 进程状态的一部分——没有共享注册表。因此,bash -c 'alias foo="bar"' 只为 bash -c 命令创建的单个 bash 实例设置别名,当该命令退出时,该别名将终止。
  • 非交互式 shell,例如使用 bash -c 创建的那些,不会从它们的父进程继承别名,读取点文件(默认情况下),因此它们开始别名表为空,即使在调用它们的(单独的)shell 中定义了别名。
  • 非交互式 shell,例如使用 bash -c 创建的 shell,默认关闭别名评估,因为这是一种交互式使用功能。

更长的答案:为什么不用别名?

别名旨在作为交互使用的工具。因此,默认情况下,它们在非交互式 shell 中根本不可用。要在非交互式 bash 实例中启用别名扩展,需要运行:

shopt -s expand_aliases

另一个问题实际上是完全定义别名。非交互式 shell 默认不运行点文件(在非交互式 shell 中运行的点文件的名称可以放在 ENVBASH_ENV 环境变量中以覆盖它),因此它们不会在 ~/.bashrc 中定义别名。

更长的答案:...那么,您怎么可能使用别名?

# create a .env file, taking care not to fail badly if shell is not bash
# note that making noninteractive shells emit content on stderr will break some software
# ...so redirecting errors is entirely essential here, and ||: is necessary to not break
# ...any noninteractive shell (like dash or ash invocations) that doesn't support shopt
# ...when that shell is invoked with the -e argument.
cat >~/.env <<'EOF'
shopt -s expand_aliases 2>/dev/null ||: "fail gracefully w/o shopt"
alias myLongCommand="my long command" 2>/dev/null ||: "fail gracefully w/o aliases"
EOF

# point to it from your .bash_profile
cat >>~/.bash_profile <<'EOF'
export ENV=$HOME/.env
[[ -e $ENV ]] && source "$ENV"
EOF

# ...and update the already-running shell:
export ENV=$HOME/.env
source "$ENV"

...在一行中执行上述操作:

printf '%s\n' 'shopt -s expand_aliases 2>/dev/null ||:' 'alias myLongCommand="my long command" 2>/dev/null ||:' >~/.env; printf '%s\n' 'export ENV=$HOME/.env' '[[ -e $ENV ]] && source "$ENV"' >>~/.bash_profile

关于linux - 使用 bash one liner 创建别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38832876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com