Bash поддерживает здесь документы и здесь строки для обеспечения стандартного ввода в программу из строки. Следующее:
./myprogram <
даст myprogram
три строки ввода, которые являются значениями lat1
, lon1
и filename1
переменные. Если вы поместите это в цикл, который каждый раз устанавливает переменные соответствующим образом, вы будете запускать myprogram
много раз, каждый раз с разным стандартным вводом.
отмечает здесь документ: это означает читать следующие строки до тех пор, пока не будет просто сказано «
EOT
», и предоставить это в качестве стандартного ввода для программы (например, делает для файла). Вы можете использовать все, что захотите, вместо
EOT
, если оно одинаково в обоих местах.
Вы также можете использовать здесь строку:
./myprogram <<<"$lat
$lon
$filename"
Это делает то же самое, но вместо этого с многострочным строковым литералом. берет заданную строку и передает ее как стандартный ввод, как указано выше. Однако я бы предпочел версию heredoc.
Альтернативный подход, который работает даже в POSIX sh
, заключается в том, чтобы просто создать соответствующий файл:
echo $lat > file
echo $lon >> file
echo $filename >> file
./myprogram < file
Этот документ лучше, если вы можете его использовать, хотя я предполагаю, что вы можете, поскольку это помечен как "bash".
Еще одна опция использует \ n
escape-последовательности и либо echo
, либо printf
:
printf '%s\n%s\n%s\n' "$lat" "$lon" "$filename" | ./myprogram
echo -e "$lat\n$lon\n$filename" | ./myprogram
-e
является обычным расширением для ] echo
, поддерживаемый Bash и другими оболочками. printf
должен работать в любой POSIX-совместимой системе.
Используйте следующее:
today_date="$(date +%Y%m%d)" # use $(...) to assign the output of a command to a variable
declare -a nodeid=(...)
for id in "${nodeid[@]}"; do
[ -e "${today_date}_MPS_Cust_dump_${id}.list.Z" ] || echo "$id is not downloaded"
done | mail -E -s "Subject" user@example.com
nodeid
.
[-e ""...]
проверяет, существует ли файл с заданным именем в текущем каталоге | | echo... ""
печатает сообщение, если файл не существует | mail...
все передается на почту
, -s
определяет тему, -E
не отправляет сообщение, когда тело пустое (все файлы существуют), а последним аргументом является адрес. Я предлагаю вам загрузить эти файлы во временную папку, а затем переместить их в нужную папку после завершения загрузки.
Чтобы вы знали, что все файлы в нужной папке полностью загружены.
Интерактивные процессы, отправляемые в фоновый режим, приостанавливаются при попытке чтения входных данных с терминала. Можно использовать терминальный мультиплексор, например, screen
screen -d -m vim
Это позволяет создать новый сеанс экрана и автоматически отсоединить его.
Используйте экран -r
для повторного подключения к нему.
Я не знаю, правильно это или неправильно, если мы делаем
ping google.com &
, тогда он все еще работает, но если мы делаем
cat >abc.txt &
, он не работает. Причина этого может быть интерактивным процесс остановлен, потому что вы можете делать что угодно, когда этот процесс находится в фоновом режиме, поэтому экономьте ресурсы