Как предложил 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 минут!
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, как в исходном коде, не знаю почему ). print -N
)на ssh
stdin, который наследуется там xargs
. xargs
читает этот список и преобразует его в аргументы для cp -t target
(-t
, являющегося также расширением GNU ). xargs
будет запускать столько cp
, сколько необходимо, чтобы избежать ограничения размера аргумента.