tl; dr
К сожалению, начиная с PowerShell 7.0, вы должны сделать следующее (если вы хотите использовать внешнюю утилиту rm
):
sh -c "rm -rf 'home/blahblah/blah'/*"
Обратите внимание, что я переключился на одинарные кавычки ('...'
) вокруг пути, поэтому я могу использовать его внутри строки с двойными кавычками ("..."
). Хотя обратное ('... "..."/*'
) должно работать как есть, в настоящее время для него требуется дополнительное экранирование ('... \"...\"/*'
) - см. этот ответ .
Однако, если путь, предшествующий /*
, на самом деле не требует цитирования - особенно если он не содержит пробелов - вы можете просто позвонить:
rm -rf home/blahblah/blah/*
Вы видите очень досадную разницу между PowerShell (начиная с версии 7.0) и POSIX-подобными оболочками, такими как Bash, в отношении обработки строковых аргументов, состоящих как из цитируемых, так и из некотируемых частей.
PowerShell анализирует "home/blahblah/blah"/*
как два аргумента:
home/blahblah/blah
становится первым аргументом, как есть в этом случае.
/*
интерпретируется как второй аргумент, который из-за того, что не заключен в кавычки и из-за вызова внешней утилиты , запускает эмуляцию PowerShell подстановки ( расширение имени файла) POSIX-подобных оболочек, что означает, что все файлы и d каталоги в каталоге root передаются как отдельные аргументы.
Следовательно, аргументы, которые фактически получает утилита rm
, следующие: -rf
, home/blahblah/blah
, /bin
, /boot
, /dev
, ... - что явно не является намерением.
Эта проблема c поведение обсуждается в этом выпуске GitHub .
Передача команды sh
, оболочке по умолчанию на Unix -подобных платформах, вместо этого позволяет обойти проблему.