Рассмотрите возможность использования «исходного кода», если вы хотите, чтобы сценарий изменил среду в текущей запущенной оболочке. Затем другие процессы и сценарии могут получить доступ к экспортированным переменным в оболочке.
source myscript
Это будет источник myscript. Файл не обязательно должен быть исполняемым, но он должен быть допустимым сценарием оболочки. Файл может находиться в текущем каталоге или в каталоге в $PATH.
. myscript
Это также будет источником myscript. Это «написание» является официальным, как определено POSIX. Bash определил источник как псевдоним точки.
Затем вы можете скопировать и изменить, например, существующий файл.bashrc/profile, чтобы переопределить PATH с выбранными параметрами. Это позволит экспортировать новые настройки в текущую запущенную оболочку. Когда вы закончите, загрузите исходный.bashrc/profile и т. д., чтобы вернуться в нормальное состояние.
Вы также можете исследовать использование команды «exec» для выполнения скрипта :Команда «exec» уничтожит или завершит текущую оболочку перед выполнением «myscript». Итак, вам нужно будет создать среду (PATH и т. д. с нуля):
#!/bin/bash
#myscript to check exec
exec /path/myRestrictedShellscript.sh
echo "This text will not be printed"
С помощью GNU awk
и некоторой помощи от xmllint
для разбора xml.
#!/bin/bash
input_file="$1"
status_file="status_file.txt"
weekend="True"
weekend="$(xmllint --xpath "//WeekendProcessing/text()" "$1")"
awk -F, -v f="$input_file" -v weekend="$weekend" '
$1 == f && $NF > max {
if (weekend == "True") {
max = $NF
} else {
d = mktime(substr($NF,1,4)" "substr($NF,5,2)" "substr($NF,7)" 00 00 00")
if (strftime("%u",d) < 6) max = $NF
}
}
END {print max}
' "$status_file"
Тестирование:
> bash test.sh test1.xml
20201023
> bash test.sh test2.xml
20201024
Примечания:
Я использовал xmllint
для извлечения текстового значения узла WeekendProseccing
с помощью одного выбора пути. Вы можете заменить его своим любимым способом получения значения из XML-файла.
Строки не сортируем, разбираем один раз файл, так тоже быстрее. Мы не вызываем внешние команды даты. Для weekend="True"
мы сохраняем максимальную дату. Или же, для weekend="False"
, мы используем функции GNU awk datetime . Мы создаем дату с помощью mktime()
и проверяем день недели с помощью strftime()
, используя формат :%u
, который возвращает число в диапазоне 1 -7 (1 для понедельника ). Таким образом, мы обновляем максимум только в том случае, если найденная более высокая дата не является субботой или воскресеньем.