Удалите строки из файла на основе узоров в другом файле, которые могут частично совпадать с конкретным столбцом в первом файле

Давайте попробуем разобраться это сначала в интерактивном режиме, а затем в сценарии. То, что вы ввели в свой вопрос, будет работать в интерактивном режиме, если первая строка вашего файла kshrc НЕ будет # ~ / usr / bin / env ksh или #! / Usr / bin / ksh или что-то подобное. Итак, я предполагаю, что мы хотим пропустить первую строку файла kshrc и (попытаться) выполнить остальную часть файла.

В качестве примера предположим, что следующее - все содержимое $ HOME / .kshrc

#!/usr/bin/env ksh
# this is my kshrc file
KSH_RED="\033[1;31m"
KSH_RESET="\033[00m"
KSH_SENTINEL="${KSH_RED}Hello from KSHRC${KSH_RESET}"

Мы можем использовать переменную sentinel, чтобы указать, был ли файл выполнен или нет. Вы можете добавить приведенные выше команды в файл $ HOME / .kshrc, чтобы использовать следующий код. Или вы можете поместить вышеуказанные команды в файл kshrc2 и внести соответствующие изменения в следующий код.

Предполагая, что в вашем $ HOME / .kshrc есть указанные выше команды, запустите новую оболочку Korn. Давайте попробуем следующие команды в интерактивном режиме в оболочке Korn:

echo $KSH_SENTINEL
KSH_SENTINEL=""
echo $KSH_SENTINEL

tail -n +2 $HOME/.kshrc > /tmp/kshrc.bash
bash
. /tmp/kshrc.bash
rm /tmp/kshrc.bash
echo $KSH_SENTINEL

Вышеупомянутое оставляет нас в интерактивной оболочке Bourne-again с переменной окружения KSH_SENTINEL из набора kshrc. Он также имеет переменные среды из любого набора файлов bashrc, который нам может не понадобиться. Мы могли бы войти в оболочку Bourne-again, используя наш файл /tmp/kshrc.bash вместо нашего bashrc, выполнив в командной строке Korn следующее:

KSH_SENTINEL=""
tail -n +2 $HOME/.kshrc > /tmp/kshrc.bash
echo "rm -f /tmp/kshrc" >> /tmp/kshrc.bash
bash -rcfile /tmp/kshrc.bash
echo $KSH_SENTINEL

До сих пор мы могли ввести интерактивный Bourne-again shell и настройте среду в соответствии с очень простым файлом kshrc. Мы сделали это с помощью временного файла /tmp/kshrc.bash, который был удален при первом получении.

Конечно, bash может подавиться некоторым синтаксисом ksh или командами в более сложных kshrc файл. Но если мы только устанавливаем переменные среды и создаем псевдонимы в нашем файле kshrc, тогда мы сможем использовать то, что мы сделали до сих пор. Если нам нужно выполнить только те разделы kshrc, которые совместимы с bash, мы можем использовать комментарии, чтобы очертить эти разделы. Затем мы могли бы использовать awk или что-то еще, чтобы скопировать эти разделы в файл /tmp/kshrc.bash.

Теперь давайте напишем сценарий оболочки Korn (как в исходном вопросе), который использует эти концепции. Сценарий запускается в оболочке Korn, извлекает команды из файла kshrc, добавляет команды bash, выполняет команды kshrc + bash и возвращается в оболочку Korn. Назовем этот ksh-скрипт «bash_my_korn.ksh».Вот одна из версий

#!/usr/bin/env ksh

#
# Say hello with the print command (ksh only)
print "Hello from $0"

#
# Set a variable for the temporary file
TMP_FILE="/tmp/kshrc.bash"

#
# Unset the sentinel
KSH_SENTINEL=""
print "Korn sentinel is $KSH_SENTINEL"

#
# Assemble the bash script in 2 sections
# Section 1:

print "#!/usr/bin/env bash" > $TMP_FILE
tail -n +2 $HOME/.kshrc >> $TMP_FILE

#
# Section 2 is the bash commands that we want to
# execute after the kshrc commands are executed
cat >> $TMP_FILE <<-EOS

echo "Hello from the Bourne-again shell"

if [[ -z "\$KSH_SENTINEL" ]] ; then
    echo "Bash can NOT see the sentinel variable"
else
    echo -e "Bash can see sentinel \$KSH_SENTINEL"
fi
print "Bash shell does not know the print command"

echo "Goodbye from Bourne-again shell"
EOS

#
# The bash command file now exits.  There are several ways to execute it.
print
print "Method 1, without the bashrc file"
bash --norc $TMP_FILE

print
print "Method 2, requires the script be executable"
chmod u+x $TMP_FILE
$TMP_FILE           # the bash command is on the first line of the script

#
# Now finish the Korn shell script
print
print "Goodbye from $0"

#
# Clean up ?
rm -f $TMP_FILE

. Надеюсь, комментарии в приведенном выше сценарии объяснят это. Идея состоит в том, чтобы собрать один сценарий bash, содержащий как команды kshrc, так и команды bash, а затем просто выполнить этот сценарий. Пример сценария ksh содержит набор команд печати, поэтому вы можете видеть, какие разделы выполняются. Сценарий может удалить себя, но, вероятно, лучше, чтобы оболочка Korn, создавшая сценарий, также удалила его.

Позвольте мне сделать несколько комментариев. Во-первых, обратите внимание, что мы можем запустить bash с параметром - norc , чтобы избежать выполнения обычного файла bashrc. Во-вторых, мы можем использовать cat для добавления команд в сценарий bash, но если команды bash содержат переменные среды, нам нужно поставить обратную косую черту перед знаком доллара, чтобы оболочка Korn не расширила переменную. , как мы делали выше. В-третьих, эту демонстрацию следует рассматривать как доказательство концепции, с которой вы можете начать работу над собственным решением.

-1
28.01.2019, 12:22
1 ответ

Why does the command ps awx not display the process identification numbers 5646 and 5669?

Поскольку вы запустили 5646только как часть команды ps awx | grep grepи 5669как часть команды ps awx | grep agetty. Они были запущены после этого первоначального списка, поэтому не были видны в нем. Оба выполнялись до тех пор, пока не обработали входные данные из процесса psв этом конкретном конвейере, поэтому они также не будут видны ни в каких последующих листингах.

Точно так же, если вы повторно запустите ps, вы увидите, что идентификатор процесса меняется :каждый раз, когда вы запускаете команду, запускается новый процесс.


Более конкретно, второй рассматриваемый процесс был таким:

5669 tty1     S+     0:00 grep --color=auto agetty

Это grep, которому были даны аргументы --color=autoи agetty. Это соответствует команде grepв ps awx | grep agetty, флаг --color=auto, вероятно, происходит от какого-то псевдонима. Это не agettyпроцесс. Один из них, вероятно, будет иметь agettyили /sbin/agettyв качестве первой части командной строки, как в этом примере из системы Debian:

1269 tty3     Ss+    0:00 /sbin/agetty --noclear tty3 linux
2
28.01.2020, 05:07

Теги

Похожие вопросы