Как условно перенаправить вывод в файлы на основе переменной в bash

Вы можете использовать блоки для преобразования /dev/sdbв физический том LVM с файловой системой данных , помещенной в логический том LVM. Как только файловая система данных окажется в логическом томе LVM, вы сможете сжать ее, а затем выделить освободившееся пространство для /var, если логический том /varне использует непрерывное выделение.

Предупреждение :При таких операциях с дисками целостность данных никогда не гарантируется. Хотя данные не должны быть уничтожены при выполнении этой процедуры, я настоятельно рекомендую сделать резервную копию, прежде чем продолжить. Вы просто никогда не знаете, что может случиться.

  1. Un -смонтировать файловую систему данных :umount /mnt/data.
  2. Преобразование раздела данных в физический том LVM:blocks to-lvm --join=VOLGROUP /dev/sdb
  3. Запустите lvs, чтобы получить имя нового LV.
  4. Отредактируйте /etc/fstabтак, чтобы /mnt/dataмонтировался из нового LV.
  5. Уменьшить новые данные LV (, используя в качестве примера 20 ГБ):lvresize -r -L -20G /dev/VOLGROUP/NAME_OF_NEW_LV
  6. Вырастить вар LV:lvresize -r -L +20G /dev/VOLGROUP/var
  7. Подключить файловую систему data :mount /mnt/data

4
19.07.2020, 20:28
1 ответ

Всегда можно:

unset -v log
# or
log=true
([ -z "$log" ] || exec >> file1; somecommand arg1 arg2)
([ -z "$log" ] || exec >> file2; somecommand arg1 arg2)

Или:

if [ -n "$log" ]; then
  exec 3>> file1 4>> file2
else
  exec 3>&1 4>&1
fi
somecommand arg1 arg2 >&3
somecommand arg1 arg2 >&4

или:

log() {
  local output="$1"; shift
  if [ -n "$output" ]; then
    "$@" >> "$output"
  else
    "$@" 
  fi
}

log "${log+file1}" somecommand arg1 arg2
log "${log+file2}" somecommand arg1 arg2

Или (убедитесь, что данные, передаваемые в eval, не являются динамическими, чтобы избежать уязвимостей внедрения кода, поэтому используйте одинарные кавычки ниже, внутри которых не происходит расширения):

eval ${log+'>> file1'} 'somecommand arg1 arg2'
eval ${log+'>> file2'} 'somecommand arg1 arg2'

Сzsh:

if (($+log)); then
  alias -g 'log?=>>'
else
  alias -g 'log?=#'
fi

somecommand arg1 arg2 log? file1
somecommand arg1 arg2 log? file2

Или даже (, если вы не собираетесь использовать >>для чего-либо, кроме условного ведения журнала):

(($+log)) || alias -g '>>=#'

somecommand arg1 arg2 >> file1
somecommand arg1 arg2 >> file2

bashне имеет alias -g, не позволяет вам использовать псевдонимы, такие как >>, но вы можете использовать простые aliases, если вы переместите перенаправление в начало:

shopt -s expand_aliases
skip_one() { shift; "$@"; }
if [[ -v log ]]; then
  alias 'log?=>>'
else
  alias 'log?=skip_one'
fi

log? file1 somecommand arg1 arg2
log? file2 somecommand arg1 arg2
7
18.03.2021, 23:18

Теги

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