0

我在登录时加载的 .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 中打开它。现在唯一发生的事情是它一直在问问题并循环,更新到 nano。CentOS 是 linux

4

3 回答 3

2

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

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

command nano "$1"
于 2014-04-22T17:27:20.940 回答
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
)
于 2014-04-22T17:21:49.577 回答
0

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

所以尝试更改脚本中的行

nano "$1"

到完整的路径

/usr/bin/nano "$1"

(或系统上安装 nano 的位置)

于 2014-04-22T17:26:34.293 回答