【问题标题】:How can I write a bash script that recognises parameters as directory如何编写将参数识别为目录的 bash 脚本
【发布时间】:2017-02-26 20:31:54
【问题描述】:

我有这个 bash 脚本来缩短我的 GitHub 推送:

#!/bin/bash

cd /Users/matias/Documents/GitHub/$1
git add *
git commit -m "$2"
git push

我是这样使用的:

matias$ path/to/script.sh project-name commit-message

问题是我要写repository的全名,而且必须在/Users/matias/Documents/GitHub/里面

我想要的是知道 $1 是一个目录,所以当我输入时,点击 tab 会自动完成结果,就像使用 nano 或类似的东西。

【问题讨论】:

标签: bash shell


【解决方案1】:

您可以将bash completion 与以下脚本push 一起使用:

#!/bin/bash

_push()
{
    IFS=$'\n'

    prev="${COMP_WORDS[COMP_CWORD-1]}"

    tmp=( $(compgen -W "$(ls -d $REPO_PATH/*/ | awk -F/ '{ print$(NF-1) }')" -- "${COMP_WORDS[$COMP_CWORD]}" ))
    COMPREPLY=( "${tmp[@]// /\ }" )
}
complete -o default -F _push ./push_git

你的脚本push_git 会是这样的:

#!/bin/bash

echo "repo is $1"
cd $REPO_PATH/$1
git add *
git commit -m "$2"
git push

为了测试它:

export REPO_PATH=/Users/matias/Documents/GitHub
source push
./push_git #TAB

在./push_git 之后写入 TAB 时,将执行 bash 完成功能。从this post,您可以完成命令"$(ls -d $REPO_PATH/*/ | awk -F/ '{ print$(NF-1) }')",其中列出了您的目标路径目录项。

如果您想要更完整的解决方案:

  • 将完成文件push 复制到/etc/bash_completion.d/push
  • 将您的脚本复制到/bin/push_git
  • 用complete -o default -F _push push_git编辑/etc/bash_completion.d/push
  • 编辑您的.bash_rc 以包含export REPO_PATH=/Users/matias/Documents/GitHub

【讨论】:

  • 这几乎有效,但在某些极端情况下会失败:包含换行符的文件名,以及可能被解释为匹配模式的文件名。
猜你喜欢
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多