我是 Bash 新手,我遇到了一个很难解决的问题,但对某些人来说可能很容易。
我有一个非常旧的 SCO UnixWare 7 系统,没有 SSH,只有 RSH 可用。 SCO已经不存在了,我相信他们已经破产了。盒子已经使用了大约 15 年,从未出现过问题。我们将在夏天离开这个平台,但现在我需要将一些文件复制到其中一个 Linux 机器上,并且我正在尝试编写一个非常短的脚本。请不要告诉我 RSH 不安全,因为在这种环境中安全性是无关紧要的。 UnixWare 盒子和另外两个运行 CentOS 6 的 Linux 盒子是专用的,仅供 3 个人使用,用于管理停车场中的多个障碍物,不连接到互联网或任何其他网络。只有 3 台服务器,连接到 4 端口独立交换机,没有其他连接
问题
我在 Unixware 服务器上运行此命令,在运行 CentOS 6 的 Linux1 上使用格式化数据设置变量并显示内容:
rsh Linux1 "TEST=$(date --date='-9day' +%A_%B-%d_Backup); echo \$TEST"
我收到这个错误
# rsh Linux "TEST=$(date --date='-9day' +%A_%B-%d_Backup); echo \$TEST"
UX:date: ERROR: Illegal option -- -
UX:date: ERROR: Incorrect usage
UX:date: TO FIX: Usage:
date [-u] [+format]
date [-u] [[mmdd]HHMM | mmddHHMM[[cc]yy]]
date [-a [-]sss.fff]
如果我转到同时运行 CentOS 6 的 Linux2 并针对 Linux1 运行相同的命令,我不会出现任何错误
[Linux2 ~]# rsh Linux1 "TEST=$(date --date='-9day' +%A_%B-%d_Backup); echo \$TEST"
Wednesday_January-14_Backup
为什么从 UnixWare 服务器运行该命令时不起作用?看来 Unixware 不会将字符串传递给 Linux1 来处理,而是尝试在本地处理它(--date
那个古老的 Unixware 盒子上没有选项,因此出现错误)。
答案1
这实际上不是 UnixWare、Bash 或 RSH 特定的问题。这是一个引用问题,它将影响任何date
与远程系统没有相同实现的系统。例如,当从运行 Bash 的 Mac SSH 到 Linux 机器时也会发生这种情况。
要使远程系统date
而不是本地系统运行,请像这样调整引用:
# rsh Linux1 'TEST=$(date --date=-9day +%A_%B-%d_Backup); echo $TEST'
请注意,我们也可以通过这种方式跳过一些内部引用和转义。