![尝试在 .bashrc 中写入和调用别名时捕获语法错误](https://linux22.com/image/1032952/%E5%B0%9D%E8%AF%95%E5%9C%A8%20.bashrc%20%E4%B8%AD%E5%86%99%E5%85%A5%E5%92%8C%E8%B0%83%E7%94%A8%E5%88%AB%E5%90%8D%E6%97%B6%E6%8D%95%E8%8E%B7%E8%AF%AD%E6%B3%95%E9%94%99%E8%AF%AF.png)
我正在尝试创建一个别名来确定是否需要重新启动服务器。
以下是我正在做的事情:
$ 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 函数而不是别名。