读取响应,然后是否循环

时间:2014-04-22 17:17:23

标签: bash function nano

我的.bash_profile中有一段粗略的代码加载登录,但我无法正常工作。可能是一些简单的修复,但是我现在正盯着它看。 代码:

# Simple backup when editing files with nano
function bu() {
    read -p "Backup >>"`basename $1`"<< b4 edit [Y/n]?" response
    echo $response
    response=$response${response,,} # tolower
    if [[ $response =~ ^(yes|y| ) ]]; then
        mkdir -p ~/.backup
        #cp -v "$1" ~/.backup/`basename $1`-`date +%Y%m%d%H%M`.backup
        cp "$1" ~/.backup/`basename $1`-`date +%Y%m%d%H%M`.backup
        echo ~/.backup/`basename $1`-`date +%Y%m%d%H%M`.backup >> ~/.backup/bu_log.txt
        nano "$1"
    else
        nano "$1"
    fi
}

它有别名nano =“bu” 所以,当我写nano时,它应该问我是否要先备份文件(是的)或者直接打开nano。 现在唯一发生的事情就是它不断提出问题和循环,更新的是纳米。 CentOS是linux

3 个答案:

答案 0 :(得分:2)

由于nanobu的别名,因此输入nano会运行您的函数,该函数调用nano,这是bu的别名,调用nano nano,...

要运行实际 command编辑器,您需要为该调用禁用别名扩展。使用command nano "$1" 内置:

{{1}}

答案 1 :(得分:0)

我想你想要:

response=${response,,}

你有

response=$response${response,,}

它会让你response=Yy。这与你的正则表达式不符。

您也可以shopt -s nocasematch

别名通常很麻烦。规则是“如果有疑问,请使用函数。”

nano() {
  bu "$@"
}
bu() ( # Use a subshell to avoid having to reset shell options
  shopt -s nocasematch
  local base=${1##*/}
  read -p "Backup >>${base}<< b4 edit [Y/n]?" response
  case $response in
    y*)
      mkdir -p ~/.backup
      local backup=~/.backup/"${base}-$(date +%Y%m%d%H%M`).backup"
      cp "$1" "$backup"
      echo "$backup" >> ~/.backup/bu_log.txt
    ;;
  esac
  command nano "$@" # Use "$@" to allow you to pass more than one argument to nano
)

答案 2 :(得分:0)

你正在以递归方式调用nano,因为你别名为nano = bu

所以尝试更改脚本中的行

nano "$1"

的完整路径
/usr/bin/nano "$1"

(或系统上安装nano的地方)