Вот практический эксперимент, который делает именно то, о чем вы спрашивали; он запускает bash
, устанавливает переменную среды, затем запускает tcsh
и меняет ее значение. Затем он проверяет значение в bash
.
#!/bin/bash
export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"
tcsh -c 'echo $SPORT; setenv SPORT archery; echo $SPORT'
printf 'SPORT is "%s"\n' "$SPORT"
Выполнение этого сценария bash
, который вызывает tcsh
, приведет к
SPORT is "baseball"
baseball
archery
SPORT is "baseball"
Но нам даже не нужно переключаться на tcsh
, чтобы увидеть это в действия, достаточно ввести подоболочку, которая имеет отдельную среду, с (...)
в нашем сценарии bash
:
#!/bin/bash
export SPORT=baseball
printf 'SPORT is "%s"\n' "$SPORT"
(
echo "$SPORT"
export SPORT=archery
echo "$SPORT"
)
printf 'SPORT is "%s"\n' "$SPORT"
Вывод останется прежним.
Одна среда не может влиять на другую за одним исключением: новая среда наследует переменные среды от родительской среды. Подоболочка (как в последнем примере) также наследует неэкспортированные переменные оболочки.
Используйте.*
:
grep "${word1}.*${word2}" "$filename"
.
соответствует любому символу *
соответствует любому номеру предыдущего символа Если вам нужно, чтобы два слова были разделены , то есть если вы не хотите сопоставить abba
если одно из слов bb
, тогда используйте
grep "\\<$word1\\>.*\\<$word2\\>" "$filename"
Шаблон\<
(здесь \\<
для экранирования первой обратной косой черты из оболочки )соответствует непосредственно перед словом, и \>
работает аналогично, но сразу после слова.
Есть также \b
, которые соответствуют до и после, а также [[:<:]]
и [[:>:]]
, которые работают так же, как \<
и \>
. Какие из них реализованы grep
различаются.