0

在 shell 中,我输入一个单引号,然后是回车,然后是一系列行,然后是另一个单引号:

root@aim:/root > '
> @stat = lstat($ARGV[0]);
> if (!@stat) {
if (@stat = lstat($ARGV[0]);) {
> print "nil\n";
> exit 0;
>  }
> '

但是,如果您注意到 shell 的解释输出:

bash: 
@stat = lstat($ARGV[0]);
if (@stat = lstat($ARGV[0]);) {
print "nil\n";
exit 0;
 }
: command not found
root@aim:/root > uname -a
IRIX64 aim 6.5 04091957 IP27
root@aim:/root > echo $0
-bash
root@aim:/root > 

您注意到!@stat转换为@stat = lstat($ARGV[0]);

应该如何编写以下 shell 程序,以便其中的 perl 程序按字面意思解释?

tramp_perl_file_attributes () {
\perl -e '
@stat = lstat($ARGV[0]);
if (!@stat) {
   print "nil\n";
   exit 0;
}
if (($stat[2] & 0170000) == 0120000)
{
   $type = readlink($ARGV[0]);
   $type = "\"$type\"";
}
elsif (($stat[2] & 0170000) == 040000)
{
   $type = "t";
}
else
{
   $type = "nil"
};
$uid = ($ARGV[1] eq "integer") ? $stat[4] : "\"" . getpwuid($stat[4]) . "\"";
$gid = ($ARGV[1] eq "integer") ? $stat[5] : "\"" . getgrgid($stat[5]) . "\"";
printf(
   "(%s %u %s %s (%u %u) (%u %u) (%u %u) %u.0 %u t (%u . %u) -1)\n",
   $type,
   $stat[3],
   $uid,
   $gid,
   $stat[8] >> 16 & 0xffff,
   $stat[8] & 0xffff,
   $stat[9] >> 16 & 0xffff,
   $stat[9] & 0xffff,
   $stat[10] >> 16 & 0xffff,
   $stat[10] & 0xffff,
   $stat[7],
   $stat[2],
   $stat[1] >> 16 & 0xffff,
   $stat[1] & 0xffff
);' "$1" "$2"
}
4

2 回答 2

2

转义!或禁用历史扩展(set +H)在您键入命令时使用。

出于某种原因,!从历史记录扩展(!!扩展为您在命令行上键入的最后一个命令),这不应该发生在单引号之间。

于 2010-07-20T15:40:59.720 回答
1

在 Debian Linux 下与 bash 4.1.5 完美配合。你在 IRIX 上有什么版本的 bash?也许它又旧又破?作为一种解决方法,您可以使用 here-docs:

tramp_perl_file_attributes () {
perl - "$1" "$2" <<'EOF'
@stat = lstat($ARGV[0]);
if (!@stat) {
   print "nil\n";
   exit 0;
}
if (($stat[2] & 0170000) == 0120000)
{
   $type = readlink($ARGV[0]);
   $type = "\"$type\"";
}
elsif (($stat[2] & 0170000) == 040000)
{
   $type = "t";
}
else
{
   $type = "nil"
};
$uid = ($ARGV[1] eq "integer") ? $stat[4] : "\"" . getpwuid($stat[4]) . "\"";
$gid = ($ARGV[1] eq "integer") ? $stat[5] : "\"" . getgrgid($stat[5]) . "\"";
printf(
   "(%s %u %s %s (%u %u) (%u %u) (%u %u) %u.0 %u t (%u . %u) -1)\n",
   $type,
   $stat[3],
   $uid,
   $gid,
   $stat[8] >> 16 & 0xffff,
   $stat[8] & 0xffff,
   $stat[9] >> 16 & 0xffff,
   $stat[9] & 0xffff,
   $stat[10] >> 16 & 0xffff,
   $stat[10] & 0xffff,
   $stat[7],
   $stat[2],
   $stat[1] >> 16 & 0xffff,
   $stat[1] & 0xffff
);
EOF
}
于 2010-07-23T20:52:10.013 回答