В PowerShell я мог запустить что-то подобное в одну строку
Get-ChildItem | foreach {
if ($_ -match '.+?\.py$' -eq $true) {
$_ | Do-Thing -WithFile
}
if ($_ -match '.+?\.pdf$' -eq $true) {
$_ | Do-Thing -WithOtherFile
}
}
вот так
Get-ChildItem | foreach { if ($_ -match '.+?\.py$' -eq $true) { $_ | Do-Thing -WithFile } if ($_ -match '.+?\.pdf$' -eq $true) { $_ | Do-Thing -WithOtherFile } }
Особую функциональность этого, что я ценю, это возможность ссылаться на объект конвейера через $_
для использования в следующей команде и возможность выполнять условное выполнение на основе разделенных частей вывода через | foreach {}
.
Я знаю, что в Bash было бы легко получить несколько шаблонов одновременно через
> ls | egrep '\.py$|\.pdf$'
some_foo.py
some_bar.py
foo.pdf
bar.pdf
Можно ли расширить это в одну строку с тем, что доступно по умолчанию, где я мог бы сделать эквивалент
| foreach { if ($_ -match '.+?\.py$') {Do-Thing -With $_ } if (...) { Do-Thing -WithOther $_ } }
или Bash перенаправляет только стандартный вывод одной команды на стандартный ввод другой команды? Я нахожу много разных вариантов использования этой динамики в PowerShell, но не слышал об аналогах в Bash.
Это не что-то блокирующее, и написание скрипта в обычном синтаксисе работает нормально, мне было просто любопытно, потому что это невероятно полезно в PS.
Ищу: $_ , | foreach {}
эквиваленты, где я мог бы разделить вывод, проверить условия на нем, а затем иметь возможность ссылаться на разделенный вывод через какое-то имя. В случае PS, $ _
Я знаю, что есть много способов, которыми PS принципиально отличается от Bash, поэтому я не удивлюсь, если это было специфично для PS.
Для лучшего контекста, вот пример в PS, где вы будете рекурсивно искать файлы с расширениями Python и PDF и записывать их в соответствующие текстовые файлы.
Get-ChildItem -Recurse | foreach {
if ($_ -match '.+?\.py$' -eq $true) {
$_ | Out-File -encoding utf8 -Append py_list.txt
}
if ($_ -match '.+?\.pdf$' -eq $true) {
$_ | Out-File -encoding utf8 -Append pdf_list.txt
}
}