0

シェルで、一重引用符、キャリッジ リターン、一連の行、さらに一重引用符を入力します。

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

ただし、シェルからの解釈された出力に気付いた場合:

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]);

次のシェル プログラムは、その中の 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 のバージョンは何ですか? 多分それは古くてバグがありますか?回避策として、ヒアドキュメントを使用できます。

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 に答える