You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:00:28