Bash 命令以轻松创建别名

Bash 命令以轻松创建别名,bash,unix,alias,Bash,Unix,Alias,我正在寻找一个简单的命令,它允许我从命令行创建另一个命令的终端别名,最好不用重新启动终端就可以使用它 用例如下所示,我刚刚创建了一个小bash脚本并将其放在gist上 # Babel in your project npm i json -g npm install --save-dev babel-core babel-cli babel-preset-es2015 babel-preset-react json -f package.json -I -e 'this.scripts.test

我正在寻找一个简单的命令,它允许我从命令行创建另一个命令的终端别名,最好不用重新启动终端就可以使用它

用例如下所示,我刚刚创建了一个小bash脚本并将其放在gist上

# Babel in your project
npm i json -g
npm install --save-dev babel-core babel-cli babel-preset-es2015 babel-preset-react
json -f package.json -I -e 'this.scripts.test = "mocha --compilers js:babel-core/register --recursive"'
json -f package.json -I -e 'this.babel = {}'
json -f package.json -I -e 'this.babel.presets = ["es2015", "react"]'
json -f package.json -I -e 'this.main = "./lib/index"'
json -f package.json -I -e 'this.esnext = "./src/index"'
我可以从终端运行它,如下所示:

bash -c "$(curl -fsSL https://gist.githubusercontent.com/reggi/8035dcbdf0fb73b8c8703a4d244f15cf/raw/767ec8c2fb54b554ce122cc85953da5b277dbaf4/babel-ready.sh)"
# non-POSIX-compliant function keyword used to allow dash in function name
function add-alias() {
  # declare locals explicitly to prevent scope leakage
  local content_line cmd

  (( $# == 1 )) && [[ $1 ]] || {
    echo "Usage: add_alias name" >&2
    return 1
  }
  IFS= read -r content_line

  # reject inputs containing newlines
  content_line=${content_line%$'\n'}
  if [[ $content_line = *$'\n'* ]]; then
    echo "ERROR: Only one line may be provided" >&2
    return 1
  fi

  # generate a command
  printf -v cmd "alias %q=%q" "$1" "$content_line"

  # eval it in the local shell, and add to the rc if that succeeds
  eval "$cmd" && printf '%s\n' "$cmd" >>"$HOME/.bashrc"
}
我很好奇是否有一种简单的方法可以从终端创建
别名。简单地说:

add-alias babel-ready -- bash -c "$(curl -fsSL https://gist.githubusercontent.com/reggi/8035dcbdf0fb73b8c8703a4d244f15cf/raw/767ec8c2fb54b554ce122cc85953da5b277dbaf4/babel-ready.sh)"
粗略的尝试(不了解流控制、不等幂、无法识别和删除同一别名的旧版本)可能如下所示:

bash -c "$(curl -fsSL https://gist.githubusercontent.com/reggi/8035dcbdf0fb73b8c8703a4d244f15cf/raw/767ec8c2fb54b554ce122cc85953da5b277dbaf4/babel-ready.sh)"
# non-POSIX-compliant function keyword used to allow dash in function name
function add-alias() {
  # declare locals explicitly to prevent scope leakage
  local content_line cmd

  (( $# == 1 )) && [[ $1 ]] || {
    echo "Usage: add_alias name" >&2
    return 1
  }
  IFS= read -r content_line

  # reject inputs containing newlines
  content_line=${content_line%$'\n'}
  if [[ $content_line = *$'\n'* ]]; then
    echo "ERROR: Only one line may be provided" >&2
    return 1
  fi

  # generate a command
  printf -v cmd "alias %q=%q" "$1" "$content_line"

  # eval it in the local shell, and add to the rc if that succeeds
  eval "$cmd" && printf '%s\n' "$cmd" >>"$HOME/.bashrc"
}
…用作:

add-alias babel-ready <<'EOF'
bash -c "$(curl -fsSL https://gist.githubusercontent.com/reggi/8035dcbdf0fb73b8c8703a4d244f15cf/raw/767ec8c2fb54b554ce122cc85953da5b277dbaf4/babel-ready.sh)"
EOF

addalias babel ready您希望
addalias
做什么?如果它应该将别名添加到
.bashrc
,并使其在当前shell中可用,那么它并不完全是微不足道的。如果它只是想在当前shell中创建别名,那么您只需使用
alias
,不是吗?如果要将别名添加到当前shell,它需要是(函数?或)别名本身。@JonathanLeffler我想要一个永久的全局别名。“不完全琐碎”是什么意思?@ThomasReggi,很容易给你一个适用于大多数系统和配置的答案,但这个答案总是有效的(理想情况下是幂等的,即如果别名已经存在,则不修改
bashrc
文件)需要能够解析和理解rc文件的代码流,这几乎是不可能的。也就是说,这里的另一个问题是,在将别名传递给我们提供的任何函数之前,需要对其进行转义——即,如果它使用literal
“$(curl…)
命令,用户将负责引用这些内容,以便在传递给命令之前不会对其进行评估,否则命令可能无法看到原始的预扩展命令内容…顺便说一句,一般来说,通常最好使用shell函数而不是别名,除非您特别需要前缀替换。函数的能力要高得多:它们实际上可以执行条件逻辑f'rinstance,来决定将参数传递给哪个命令。