Linux спец. символы и переменные (> >> $ & # ~/$HOME $USER \ | /n \t ^M $? * ; (); redirect stdout/stderr)

https://www.gnu.org/software/bash/manual/ – manual по bash

stdout/stderr

&> file – redirect all (stdout/stderr)

> file – redirect stdout

2> file – redirect stderr

ls > a.txt 2>b.txt  # в файле a.txt будет вывод ls, а в файл b.txt будем пустым т.к. нет ошибок
ls fdsfsdf > a.txt 2>b.txt # файл a.txt будет пустым, а в файле b.txt будет ошибка No such file or directory

$HOSTNAME – хранит имя хоста (сервера/ПК)

$STY – хранит имя сессии в screen

$PATH – важная переменная, указывающая директории, в которых оболочка будет искать исполняемые файлы, особенности с этой переменной возникают при запуске процесса из под другого пользователя – напр. автоматизация с использованием cron или логин из под другого пользователя (и даже с переходом в нужного из пользователя с другим PATH), возможность запуска скрипта из любой директории. Легко модифицируется в .bashrc.
export PATH="$PATH:/root/"  # добавляем root директорию для поиска исполняемых файлов

\  – экранирование пробела в названии, например при работе с файлами/папками.

rm -r Miscellaneous\ Directory

& – перенос процесса в background

rm nohup.out; nohup ./proc.py & tail -f nohup.out

; – замена newline

Вместо Newline можно использовать ; тогда генерация однострочный скриптов становится еще более изощренной. С другой стороны – не надо делать файлы, менять их права, запускать. Вставил и получил результат.

read -p "Enter delay: "delay; echo "$delay"; sort -r -n -k 7 -k 4 /var/log/log.txt*


rm nohup.out; nohup ./proc.py & tail -f nohup.out

set -e – любой exception в любой строке приводит к полной остановке кода всего скрипта, по сути аналогия exception в коде python/ruby без try/except. По умолчанию без set -e execution переключается на строчку ниже. В качестве демонстрации достаточно задать set -e в самом интерпретаторе bash и выполнить ошибочную команду – интерпретатор прервет работу.

Exit immediately if a pipeline (see Pipelines), which may consist of a single simple command (see Simple Commands), a list (see Lists of Commands), or a compound command (see Compound Commands) returns a non-zero status.

# example 1
% set -e
% ls d
ls: d: No such file or directory
[Процесс завершен]

# example 2
% cat test.sh
set -e
echo 123
echo 321
efdf
echo 333

% ./test.sh
123
321
./test.sh: line 4: efdf: command not found

#! – shebang символ, позволяет сделать ссылку на интерпретатор. В таком случае запуск скрипта возможен без указания интерпретатора – для запуска Ruby скрипта test.rb достаточно написать “test.rb” в командной строке вместо “ruby test.rb”.

#!/bin/bash – ссылка на интерпретатор sh
#!/usr/bin/ruby - на интерпретатор ruby
When running the script without a specified interpreter, the machine attempts to run the script as a shell script instead of a Ruby script. By putting Ruby in front of the script, we explicitly tell the machine to run the script through the Ruby interpreter, and the script runs as we would expect. But there's also a way to specify the interpreter inside the script, so you don't need to use the explicit call to Ruby every time you want to run the script. You can accomplish this by adding a shebang (#!) line at the beginning of the file!

Для лучшей переносимости кода между Unix-like системами рекомендуют использовать не прямой путь, а утилиту env, которая делает поиск в $PATH пути к интерпретатору самостоятельно.

#!/usr/bin/env bash
#!/usr/bin/env ruby

Лучшей практикой, несмотря на то, что по умолчанию исполняемые файлы обрабатываются посредством SH, по аналогии с expect, perl, ruby и  прочими, добавлять ссылку на интерпретатор (прямую или лучше через env) в начале кода во всех BASH скриптам.

В случае жесткого задания пути, для поиска папки, в которой находится интерпретатор, можно использовать whereis.

$ whereis bash
bash: /usr/local/bin/bash /usr/local/man/man1/bash.1.gz /usr/ports/shells/bash

$ whereis expect
expect: /usr/local/bin/expect /usr/local/man/man1/expect.1.gz /usr/ports/lang/expect

Так же кто-то заморачивается и не использует env – вместо него вызывает скрипт как bash, обнаруживает интерпретатор python и передает ему все аргументы. Не знаю насколько такой подход оправдан, на первый взгляд выглядит излишеством.

"source" "find_python.sh" "--local"
"exec" "$PYTHON" "$0" "$@"

Слишком длинная строка

Возможна трабла с сохранением в файл строки из-за ограничения длины строки в Linux.

Решается echo:

echo "USER-2019-0915 … many words … USER-2019-0609" | tr ' ' '\n' | wc

 

Leave a Reply