2010-07-20 70 views
0

在shell,我進入一個單引號,然後回車,然後一系列的線,然後又單引號:IRIX的bash shell擴展表達的單引號,但不應該

[email protected]:/root > ' 
> @stat = lstat($ARGV[0]); 
> if ([email protected]) { 
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 
[email protected]:/root > uname -a 
IRIX64 aim 6.5 04091957 IP27 
[email protected]:/root > echo $0 
-bash 
[email protected]:/root > 

您注意到[email protected]被轉換爲@stat = lstat($ARGV[0]);

應該如何跟隨着g shell程序應該如何編寫,以便它內部的perl程序能被字面解釋?

tramp_perl_file_attributes() { 
\perl -e ' 
@stat = lstat($ARGV[0]); 
if ([email protected]) { 
    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" 
} 

回答

2

逃離!或禁用歷史擴展(與set +H)當你鍵入命令。

出於某種原因,!從歷史擴展(!!被擴展到您的命令輸入的最後一個命令線)應該不會發生在單引號之間

+0

從bash手冊:「只有反斜槓(\\)和單引號可以引用歷史擴展字符。」 – 2010-07-23 20:43:49

+0

這可能是如此,但看着OP的問題,您可以清楚地看到!@已擴展從歷史上看。我不知道*爲什麼*(因爲我同意單引號應該阻止),但它發生。我已經更新了我的答案,以更清楚地強調這一點。 – 2010-07-26 09:13:29

1

在Debian Linux下完美地使用bash 4.1.5在IRIX上有什麼版本的bash?也許它是舊的和bug的嗎?作爲一種解決方法,您可以使用here-docs:

tramp_perl_file_attributes() { 
perl - "$1" "$2" <<'EOF' 
@stat = lstat($ARGV[0]); 
if ([email protected]) { 
    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 
}