Сохранение результатов поиска в переменной с последующей передачей в cp?

Как предложил Biswapriyo , я разделил сценарий на два:script1и script2. Содержимое script1—:

#!/bin/bash
pacman -Sy reflector --noconfirm
timedatectl set-ntp true

parted --script /dev/sda \
    mklabel msdos \
    mkpart primary ext4 1MiB 10GiB \
    set 1 boot on \
    mkpart primary ext4 10GiB 100%

mkfs.ext4 -F /dev/sda1
mkfs.ext4 -F /dev/sda2
mount /dev/sda1 /mnt

reflector --country Bangladesh --country 'United States' --protocol http --protocol https --sort rate --save /etc/pacman.d/mirrorlist

pacstrap /mnt base
genfstab -U /mnt >> /mnt/etc/fstab
cp script2 /mnt/home/
arch-chroot /mnt sh /home/script2

rm /mnt/home/script2
echo 'Setup Complete!'
echo 'type "reboot" and remove installation media.'

и то же самое из script2есть:

#!/bin/bash
ln -sf /usr/share/zoneinfo/Asia/Dhaka /etc/localtime
hwclock --systohc
sed -i -e 's/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf
echo 'haque' > /etc/hostname
echo '127.0.0.1 localhost
::1 localhost
127.0.1.1   haque.localdomain   haque' >> /etc/hosts

pacman -S base-devel grub bash-completion sddm plasma-desktop plasma-nm plasma-pa konsole kwrite dolphin breeze-gtk kde-gtk-config falkon --noconfirm

grub-install --target=i386-pc /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

echo '[Theme]
Current=breeze' >> /etc/sddm.conf

sed -i -e 's/# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/g' /etc/sudoers

echo 'Set root password'
passwd

read -p "Enter username: " name
useradd -m $name
echo "Set password for $name"
passwd $name

usermod -aG wheel,audio,video,optical,storage $name
systemctl enable sddm NetworkManager

exit 

С этими двумя в live usb мне просто нужно сначала ввести sh script1, установить пароль root, имя пользователя и пароль пользователя при появлении запроса и в конце ввести reboot.

Теперь я могу установить Arch менее чем за 5 минут!

0
18.11.2020, 20:37
1 ответ

bashне лучшая оболочка для этого. Я бы порекомендовал zshвместо (вы уже используете синтаксис zsh, не цитируя некоторые расширения ваших параметров):

filelist=(
  ${(0)"$(
    ssh $SSHUSER@$SSHHOST "
      cd -- ${(qq)REMOTEPATH} &&
        find. -amin +${TIME} -type f,d -prune -print0"
  )"}
)

if (( $#filelist < 4 )); then
  print No files >> $LOGFILE
else
  print "Copying remote files to remote backup" >> $LOGFILE
  print -rNC1 -- $filelist | ssh $SSHUSER@$SSHHOST "
    cd -- ${(qq)REMOTEPATH} && xargs -r0 cp -Rpvt ${(qq)REMOTEBACKUPPATH}"
fi

(предполагая, что $SSHHOSTявляется системой GNU (вы уже использовали некоторые GNU-измы, такие как f,d, ни один файл не передавался в find, cp -v), и оболочка входа $SSHUSERесть Bourne -как ).

Я добавил -pruneв команду find, поскольку вы в любом случае собираетесь копировать все эти каталоги, поэтому в любом случае нет смысла искать там дополнительные файлы. Кроме того, чтение содержимого этих каталогов обновит время их последнего доступа.

В любом случае обратите внимание, что чтение файла в каталоге не обновляет время доступа к каталогу. Время доступа к каталогу обновляется, когда его собственное содержимое читается, например, когда вы используете ls/ findили глобусы оболочки в нем (также обратите внимание, что в наши дни время доступа не всегда тщательно поддерживается ). Так что не ясно, что именно вы пытаетесь сделать.

Выше мы используем:

  • filelist=( values )для определения массива переменной (, где filelist=valueбудет определять скалярную переменную вместо ).
  • ${(0)"$(cmd)"}разделяет вывод cmdна NUL. Использование списка с разделителями NUL является безопасным способом передачи списка путей к файлам, поскольку NUL — единственный символ, не разрешенный в пути к файлу.
  • cd -- ${(qq)REMOTEPATH}, с --для защиты от значений $REMOTEPATH, которые начинаются с -(, а не самого -, хотя и -4/ +3в некоторых оболочках ),и значение $REMOTEPATH(, которое расширено локальной оболочкой здесь )в кавычках (с использованием одинарных кавычек с qq, единственный безопасный способ сделать это)для удаленной оболочки (если предположить, что это Bourne -, это не сработает для некоторых значений $REMOTEPATH, если оболочка входа $SSHUSER— csh/fish/rc... ).
  • обратите внимание на &&, который гарантирует, что следующая команда будет запущена только в том случае, если cdбыл успешным, иначе вы запустите ее в неправильном каталоге.
  • -print0:вывести пути к файлам с разделителями NUL (см. выше ).
  • Затем $#filelistбудет содержать количество совпадающих файлов (, которые мы сравниваем с 4, как в исходном коде, не знаю почему ).
  • Затем нам нужно отправить этот список обратно на удаленный хост. Вместо того, чтобы передавать его в качестве аргументов в коде оболочки, который он отправил туда для удаленной оболочки (, для которой мы запускали бы всевозможные проблемы и ограничения ), мы передаем его с разделителями NUL (сprint -N)на sshstdin, который наследуется там xargs.
  • xargsчитает этот список и преобразует его в аргументы для cp -t target(-t, являющегося также расширением GNU ). xargsбудет запускать столько cp, сколько необходимо, чтобы избежать ограничения размера аргумента.
5
18.03.2021, 22:48

Теги

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