Не удается выполнить системную команду в Cygwin - PullRequest
0 голосов
/ 29 октября 2011

У меня есть следующий простой скрипт на Perl, который я не могу выполнить в cygwin:

#!/usr/bin/perl

use strict;


system("../cat.exe < a.txt > b.txt");

Когда я его запускаю, скрипт говорит мне:

./my_test.pl
'..' is not recognized as an internal or external command,
operable program or batch file.

Однако я могу запуститькоманда в оболочке cygwin:

$ ../cat.exe < a.txt > b.txt

$ ../cat.exe b.txt
hello

Исполняемый файл cat.exe существует в указанном выше каталоге и a.txt в текущем рабочем каталоге.

Моя версия perl: $ perl -v

Это perl, v5.8.8, созданный для многопоточности MSWin32-x86 (с 12 зарегистрированными исправлениями, подробнее см. Perl -V)

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

Вы используете Perl, созданный для Windows (ActiveState? Strawberry?), А не версию Cygwin. Он вызывает cmd.exe для system(), который считает, что .. является командой, а / вводит опцию.

Попробуйте изменить system() вызов на:

system("..\\cat.exe < a.txt > b.txt");

Но вы должны обычно использовать версию Perl Cygwin при запуске скрипта из bash.

Что выводят следующие команды?

echo "$PATH"
type -a perl
/usr/bin/perl -v

Из того, что мы видели до сих пор, похоже, что вы установили какой-то специфичный для Windows Perl с perl.exe в каталог Cygwin /usr/bin. Если это так, то (а) удалите его (вы можете переустановить его в другом месте, если хотите) и (б) переустановите пакет «perl» через Cygwin's setup.exe.

(И добавить use warnings; после use strict; в ваших скриптах Perl. Это не связано с вашей проблемой, но это хорошая практика.)

1 голос
/ 29 октября 2011

Сообщение об ошибке очевидно приходит от cmd.exe, который, по-видимому, является вашей оболочкой по умолчанию. Что говорит echo $SHELL? Возможно, вам нужно определить эту переменную, чтобы она стала /bin/bash.exe.

...