尝试在 .bashrc 中写入和调用别名时捕获语法错误

尝试在 .bashrc 中写入和调用别名时捕获语法错误

我正在尝试创建一个别名来确定是否需要重新启动服务器。

以下是我正在做的事情:

$ echo "alias rcr='if [ -f /var/run/reboot-required ]; then read -p \"Continue? (Y/N): \" confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1 && reboot; else echo No reboot needed; fi'" >> ~/.bashrc
$ source ~/.bashrc
$ rcr

但这会引发一个错误:

bash: conditional binary operator expected
bash: syntax error near `[yY]'

我尝试了所有我能想到的不同组合,从转义字符到前缀变量。我对 bash 还不熟悉(一般来说对 Linux 不熟悉),所以我只是想掌握它。

我在这里做错了什么? 以下是添加到的内容.bashrc

alias rcr='if [ -f /var/run/reboot-required ]; then read -p "Continue? (Y/N): " confirm && [[  == [yY] ||  == [yY][eE][sS] ]] || exit 1 && reboot; else echo No reboot needed; fi'

答案1

外部双引号允许你的交互式 shell 扩展$confirm(可能为一个空值),这样你实际写入 .bashrc 文件的内容就是

alias rcr='if [ -f /var/run/reboot-required ]; then read -p "Continue? (Y/N): " confirm && [[  == [yY] ||  == [yY][eE][sS] ]] || exit 1 && reboot; else echo No reboot needed; fi'

您可以通过转义$(这是引用的另一种形式)来防止这种情况:

$ echo "alias rcr='if [ -f /var/run/reboot-required ]; then read -p \"Continue? (Y/N): \" confirm && [[ \$confirm == [yY] || \$confirm == [yY][eE][sS] ]] || exit 1 && reboot; else echo No reboot needed; fi'"
alias rcr='if [ -f /var/run/reboot-required ]; then read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1 && reboot; else echo No reboot needed; fi'

然而在我看来,使用这里引用的文档来完全防止扩展会更简单、更清晰:

cat >> ~/.bashrc << 'EOF'

alias rcr='
  if [ -f /var/run/reboot-required ]; then 
    read -p "Continue? (Y/N): " confirm
    case $confirm in 
      ([yY]|[yY][eE][sS]) reboot ;; 
    esac
  else
    echo "No reboot needed"
  fi
'
EOF

我还擅自将您的条件转换为 case 语句。您还可以考虑在此处使用 shell 函数而不是别名。

相关内容