RHEL环境下R Shiny Server发布Bash脚本报错求助
解决Bash脚本执行时的\r换行符错误及优化Shiny发布脚本
你的脚本核心问题是Windows换行符(CRLF)不兼容Linux系统——Bash会把Windows格式的\r字符当成文件名/命令的一部分,这就是报错里shinyApp\r、shiny-server\x0d.service这些奇怪字符的来源。下面一步步解决:
1. 修复脚本的换行符问题
你的脚本是在Windows环境下编辑的,保存时用了CRLF(\r\n)换行,而Linux系统要求LF(\n)换行。有几种快速修复方式:
方法一:用dos2unix转换
如果系统安装了dos2unix工具,直接执行:
dos2unix PubExisting.sh
方法二:用sed删除\r字符
如果没有dos2unix,用sed命令替换掉所有\r:
sed -i 's/\r$//' PubExisting.sh
方法三:在编辑器里修改换行格式
比如用VS Code,右下角可以切换换行格式为LF后重新保存;用vim的话,执行:set fileformat=unix再保存(:wq)。
2. 优化脚本的健壮性(可选但推荐)
原脚本缺少参数检查和错误处理,即使换行符修复了,也可能因为参数缺失、目录不存在等问题出错。这里给你一个更安全的版本:
#!/bin/bash set -euo pipefail # 脚本在出错时立即退出,避免后续错误操作 # 检查是否提供了参数 if [ $# -ne 1 ]; then echo "用法: $0 <dashboard名称>" exit 1 fi dashboard="$1" shiny_app_dir="/opt/shiny-server/samples/sample-apps" user_home="/home/Username" # 检查用户目录下的目标应用是否存在 if [ ! -d "${user_home}/${dashboard}" ]; then echo "错误: ${user_home}/${dashboard} 目录不存在!" exit 1 fi # 执行发布操作 echo "开始发布 ${dashboard}..." cd "${shiny_app_dir}" rm -rf "${dashboard}" mv "${user_home}/${dashboard}" "${shiny_app_dir}" chmod -R 777 "${dashboard}" systemctl restart shiny-server echo "Server已重启,Dashboard ${dashboard} 发布完成!"
优化点说明:
set -euo pipefail:让脚本在任何命令失败、变量未定义、管道出错时立即退出,防止错误扩散- 参数检查:确保用户提供了正确的参数数量
- 目录存在检查:避免
mv命令因为源目录不存在而报错 - 使用变量存储固定路径:方便后续修改,减少重复代码
- 增加提示信息:让用户清楚当前执行的步骤
3. 验证修复效果
转换换行符后,给脚本添加执行权限(如果还没加):
chmod +x PubExisting.sh
然后重新执行:
./PubExisting.sh shinyApp
这样应该就能正常完成Shiny应用的发布了。
内容的提问来源于stack exchange,提问作者Programming_Noob
相关产品推荐
相关产品推荐

