Скобки (скобки), одиночные [
или пара [ ]
, являются встроенными в bash
, который является оператором проверки (см. man test
), и его последнее использование неверно.Но вам не нужно создавать каталог
use warnings;
use strict;
use feature 'say';
my $ssh = '/usr/bin/ssh';
my $user_id = ...
my $host = ...
my $to = quotemeta $user_id.'@'.$host;
my $cmd = 'mkdir -p TEST_MKDIR_OVER_SSH';
system("$ssh $to $cmd") == 0 or die "Can't mkdir: $!";
mkdir
тихо работает с -p
, если каталог уже существует, и возвращает успех, что также не соответствует цели [ ]
(если это было намерение).Но фактическая ошибка - файл с таким именем существует, без прав доступа к пути и т. Д. - возвращается к сценарию, как вам нужно, и к строке с сообщением об ошибке.находится в $!
, поэтому, пожалуйста, проверьте это.
Если вы просто хотите узнать, существует ли каталог, пожалуйста, верните вашу тестовую ветку или просто пропустите -p
и проанализируйте $!
, что это за сообщениенаходится в вашей системе.
Что касается второй попытки: команда, которая будет выполнена, выполняется на удаленной системе и больше не имеет ничего общего с этим сценарием (кроме интерполированных переменных).Поэтому функции или библиотеки Perl из этого скрипта не имеют смысла в этой команде.
Для следующего шага я предлагаю изучить модули для (подготовки и) запуска внешних команд, которые гораздо более полезны, чем голые system
.
Некоторые, от простых до более способных: IPC :: System :: Simple , Capture :: Tiny , IPC :: Run3 , IPC :: Run .Также см. String :: ShellQuote , чтобы подготовить команды и избежать проблем с цитированием, ошибок внедрения оболочки и других проблем.Недавний пост содержит примеры этого;искать больше.