本地SSH连接时Bash脚本重定向歧义错误的原因与解决
问题描述
执行如下Bash脚本时,跨主机SCP传输后可正常将输出(含错误信息)写入指定日志文件,但在本地SSH连接自身主机执行该脚本时会报错ambiguous redirect 1;直接在终端执行脚本内的SCP命令却无异常。系统为Ubuntu 18.04及22.04,相关内容如下:
脚本内容:
#!/bin/bash scp /tmp/v8_8PcnYL_41.sh evgeniy@Ubuntu-VM2:/tmp/v8_8PcnYL_44.sh >> "/tmp/v8_8PcnYL_42.log" 2>&1
控制台输出:
evgeniy@Ubuntu-VM2:~$ sudo su usr1cv8 [sudo] Enter password for evgeniy: $ cat /tmp/v8_8PcnYL_43.sh #!/bin/bash scp /tmp/v8_8PcnYL_41.sh evgeniy@Ubuntu-VM2:/tmp/v8_8PcnYL_44.sh >> "/tmp/v8_8PcnYL_42.log" 2>&1 $ ls -lha /tmp/v8_8PcnYL_43.sh -rwxr-x--x 1 usr1cv8 grp1cv8 111 сен 28 20:34 /tmp/v8_8PcnYL_43.sh $ bash /tmp/v8_8PcnYL_43.sh : ambiguous redirect 1 $ $ scp /tmp/v8_8PcnYL_41.sh evgeniy@Ubuntu-VM2:/tmp/v8_8PcnYL_44.sh >> "/tmp/v8_8PcnYL_42.log" 2>&1 $ cat /tmp/v8_8PcnYL_42.log $ exit evgeniy@Ubuntu-VM2:~$ cat /tmp/v8_8PcnYL_44.sh #!/bin/bash cd ~/ /opt/mssql-tools/bin/sqlcmd -S CHECK -U sa -P [hidden] -h -1 -b -Q "SELECT name FROM master.dbo.sysdatabases" exit $? evgeniy@Ubuntu-VM2:~$
原因分析
报错的核心原因是脚本文件使用了Windows格式的CRLF(回车+换行)换行符,而Bash仅识别Unix格式的LF(换行)换行符。当Bash解析脚本时,会把2>&1后面的CR字符(不可见的^M)当成命令的一部分,导致重定向语法被错误解析,从而抛出ambiguous redirect错误。
直接在终端输入命令时,系统会自动使用LF换行符,因此不会出现问题;跨主机SCP传输时,部分环境会自动将CRLF转换为LF,所以脚本能正常执行。
解决方法
将脚本文件的换行符转换为Unix格式的LF即可,有以下几种方式:
- 使用
dos2unix命令转换:
dos2unix /tmp/v8_8PcnYL_43.sh
若系统未安装dos2unix,可执行sudo apt install dos2unix完成安装。
- 使用
sed命令去除CR字符:
sed -i 's/\r$//' /tmp/v8_8PcnYL_43.sh
- 用文本编辑器转换:
比如用vim打开脚本,执行:set fileformat=unix,再输入:wq保存退出。
内容的提问来源于stack exchange,提问作者Jane Glass
相关产品推荐
相关产品推荐

