IRIX bash shell расширяет выражение в одинарных кавычках, но не должно
В оболочке я ввожу одинарную кавычку, затем возврат каретки, затем последовательность строк и еще одну одинарную кавычку:
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"
}
2 ответа
Избежать !
или отключить расширение истории (с помощью set +H)
пока вы набираете команду.
По какой-то причине !
расширен из истории (!!
расширяется до последней введенной вами команды в командной строке), что не должно происходить между одинарными кавычками.
Здесь отлично работает с bash 4.1.5 под Debian Linux. Какая версия Bash у вас есть на IRIX? Может это старый и глючный? В качестве обходного пути вы можете использовать здесь документы:
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
}