Вы можете использовать встроенную функцию printf
.
mo1 () {
for file in *.txt; do
grep -n -C1 "$(printf "%s.*" "$@")" "$file"
done
}
Эта простая версия вставляет . *
после последнего элемента. Это не имеет значения для этого конкретного варианта использования, но в других случаях (например, grep -o
) вам может потребоваться удалить лишний . *
в конце.
mo1 () {
pattern=$(printf "%s.*" "$@")
pattern=${pattern%??}
for file in *.txt; do
grep -n -C1 "$pattern" "$file"
done
}
В bash вы можете поместить вывод printf
непосредственно в переменную, что немного быстрее, чем при использовании подстановки команд (но это вряд ли когда-либо будет иметь значение, даже в Cygwin, где подоболочки работают медленно).
mo1 () {
printf -v pattern "%s.*" "$@"
pattern=${pattern%??}
for file in *.txt; do
grep -n -C1 "$pattern" "$file"
done
}
Если вы хотите вставить один символ между позиционными параметрами, вы можете установить IFS
для этого символа и использовать «$ @»
. Но это не сработает, если разделитель состоит более чем из одного символа. В ksh и bash, если есть символ, которого нет в шаблоне, вы можете использовать его для присоединения, а затем выполнить замену. Например, здесь было бы бессмысленно, чтобы шаблоны содержали символы новой строки, поэтому:
mo1 () {
typeset IFS=$'\n'
typeset pattern="$*"
pattern=${pattern//$'\n'/.*}
for file in *.txt; do
grep -n -C1 "$pattern" "$file"
done
}
В zsh, конечно, есть прямой способ.
mo1 () {
for file in *.txt; do
grep -n -C1 ${(j:.*:)@} $file
done
}
Я считаю, что этот вопрос будет связана с запросом на монт Windows, ущерб. Когда процесс разветвленного Unix получает сообщение обратно из Windows, появляется шарика.
Это домино в другие сферы, где ресурс «A» запрашивается напрямую или косвенно. Я видел это совсем недавно относительно событий, связанных с VM.