Du bist nicht angemeldet.
Hallo zusammen!
Ich schreibe aktuell ein Shellscript, um mir die vielen Installationen, die auf Dauer zusammenkommen etwas einfacher zu machen.
Bei der Installation von zusaetzlichen Paketen mittels:
PKGS=(
# additional packages --------------------------------------------------
'vim' # Tab completion for Bash
)
for PKG in "${PKGS[@]}"; do
echo "INSTALLING: ${PKG}"
sudo pacman -S "$PKG" --noconfirm
done
Bekomme ich von pacman:
error: target not found:
Dabei habe ich davor das System mit "sudo pacman -Syu" auf den neuesten Stand gebracht.
Habt ihr vielleicht einen Tipp was ich falsch mache?
LG Marcel
Warum verwendest du im Aufruf
sudo pacman -S "$PKG" --noconfirm
die Variable nicht genau so wie zuvor in
echo "INSTALLING: ${PKG}"
?
Durch die Anführungszeichen wird die Variable zu einem Literal
error: target not found:
Geht die Fehlermeldung noch weiter?
Offline
@yaiSho5o Du hast Recht, das habe ich uebersehen.
@Dirk Nein, es kommt lediglich in einer Zeile "error: target not found:"
Mit dem berarbeitetem Code
PKGS=(
# TERMINAL UTILITIES --------------------------------------------------
'vim' # Tab completion for Bash
)
for PKG in "${PKGS[@]}"; do
echo "INSTALLING: ${PKG}"
sudo pacman -S ${PKG} --noconfirm
done
bekomme ich nun (wieder nur eine Zeile) diese Fehlermeldung:
error: no targets specified (use -h for help)
'Vim' dabei in doppelte Anfuehrungszeichen zu setzen hat das Ergebniss nicht veraendert.
LG Marcel
@yaiSho5o Du hast Recht, das habe ich uebersehen.
@Dirk Nein, es kommt lediglich in einer Zeile "error: target not found:"Mit dem berarbeitetem Code
PKGS=( # TERMINAL UTILITIES -------------------------------------------------- 'vim' # Tab completion for Bash ) for PKG in "${PKGS[@]}"; do echo "INSTALLING: ${PKG}" sudo pacman -S ${PKG} --noconfirm done
bekomme ich nun (wieder nur eine Zeile) diese Fehlermeldung:
error: no targets specified (use -h for help)
'Vim' dabei in doppelte Anfuehrungszeichen zu setzen hat das Ergebniss nicht veraendert.
LG Marcel
Das ist in der Tat extrem merkrürdig, denn die erste Zeile der Ausgabe sollte mit
INSTALLING:
beginnen.
Wie führst du das Skript aus?
Wie lautet das vollständige Kommando und die vollständige Ausgabe?
Bitte gib zusätzlich die Ausgabe von
$ env
$ echo -$IFS-
an.
Offline
Hallo Schard,
Der gesammte Abschnitts des Scripts ist wie folgt:
echo "-----------------------------------------------"
echo "-- Updating system --"
echo "-----------------------------------------------"
sudo pacman -Syu
echo "-----------------------------------------------"
echo "-- Install additional packages --"
echo "-----------------------------------------------"
PKGS=(
# TERMINAL UTILITIES --------------------------------------------------
"vim" # Tab completion for Bash
)
for PKG in "${PKGS[@]}"; do
echo "INSTALLING: ${PKG}"
sudo pacman -S ${PKG} --noconfirm
done
echo "--------------------------------------"
Und der gesammte Output lautet:
-----------------------------------------------
-- Updating system --
-----------------------------------------------
:: Synchronizing package databases...
core is up to date
extra is up to date
community is up to date
:: Starting full system upgrade...
there is nothing to do
-----------------------------------------------
-- Install additional packages --
-----------------------------------------------
INSTALLING:
error: no targets specified (use -h for help)
--------------------------------------
"ifs"-output:
-
-
"env"-output:
HOME=/root
USER=root
SHELL=/usr/bin/zsh
TERM=linux
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
MAIL=/var/spool/mail/root
LOGNAME=root
MOTD_SHOWN=pam
XDG_SESSION_ID=1
XDG_RUNTIME_DIR=/run/user/0
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus
XDG_SESSION_TYPE=tty
XDG_SESSION_CLASS=user
XDG_SEAT=seat0
XDG_VTNR=1
SHLVL=1
PWD=/root/aai
OLDPWD=/root
LANG=en_US.UTF-8
EDITOR=vim
PAGER=less
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
LESS_TERMCAP_mb=[01;31m
LESS_TERMCAP_md=[01;31m
LESS_TERMCAP_me=[0m
LESS_TERMCAP_se=[0m
LESS_TERMCAP_so=[01;44;33m
LESS_TERMCAP_ue=[0m
LESS_TERMCAP_us=[01;32m
COLORTERM=yes
LC_MESSAGES=
_=/usr/bin/env
Mein Vorgehen:
1.) Ich bringe die Repos auf den neuesten Stand und installiere git: "pacman -Syy git"
2.) Ich hole mir das Script mittels git
3.) Ich wechsle in den Ordner des Scripts: cd aai ("aai" steht für "automatic arch installation")
4.) Ich mache das Script ausführbar: chmod +x install.sh
5.) Ich führe es aus: ./install.sh
Nachdem das Script die erste Hälfte in dem ISO-Environment erledigt (z.B. Partitionierung, Fstab generieren und Installation von Basispaketen mittels pacstrap) steht die zweite Hälfte in folgender Syntax (EOF) um in dem gerade erstellten System ausgeführt zu werden (z.B Konfiguration des Bootloaders und Systems, und Installation weiterer Pakete mittels pacman):
arch-chroot /mnt /bin/bash <<EOF
...
...
echo "Setting user account"
sed -i 's/^# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/' /etc/sudoers
useradd -m -g users -G wheel $user
echo "$user:$user_password" | chpasswd
# Add sudo no password rights
sed -i 's/^# %wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers
su $user
sudo pacman -Syu
echo "--------------------------------------"
echo "-- Install additional packages --"
echo "--------------------------------------"
PKGS=(
# TERMINAL UTILITIES --------------------------------------------------
"vim" # Tab completion for Bash
)
for PKG in "${PKGS[@]}"; do
echo "INSTALLING: ${PKG}"
sudo pacman -S ${PKG} --noconfirm
done
...
...
sudo sed -i 's/^%wheel ALL=(ALL) NOPASSWD: ALL/# %wheel ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers
EOF
Gerade fällt mir auf, dass mein Script mit "#!/usr/bin/env bash" startet, wobei in der Arch-ISO scheinbar die zhs der Standard ist. Daran liegt es aber m.M.n nicht, da der Rest des Scriptes einwandfrei aufgeführt wird.
LG Marcel
Die zsh ist weitgehend zur bash kompatibel.
Ich kann dein Problem mit dem von dir geposteten Skript weder mit der bash, noch in der zsh nachvollziehen.
Ist es möglich dass du während mit dem Git-Klon eine veraltete Version des Skripts mit Bugs darin lädst?
Offline
Zeig mal die Ausgabe von:
$ bash -xv deinscript.sh
Offline
Zeig mal die Ausgabe von:
$ bash -xv deinscript.sh
Das startet lediglich das Script.
@Schard Das ist ausgeschlossen, da ich mir das Script vorher immer mit cat anschaue. Ich bin mittlerweile davon überzeugt, dass dieses
arch-chroot /mnt /bin/bash <<EOF
...
EOF
nicht in der Lage ist solche Befehle über mehrere Zeilen hinweg auszuführen, da ich zum einen sehr wohl in der Lage bin ins installierte System zu chrooten, und dort ein Script mit folgendem Inhalt zu erstellen uns erfolgreich auszuführen:
PKGS=(
# TERMINAL UTILITIES --------------------------------------------------
"vim" # Tab completion for Bash
)
for PKG in "${PKGS[@]}"; do
echo "INSTALLING: ${PKG}"
sudo pacman -S ${PKG} --noconfirm
done
Und zweitens kann ich auch "arch-chroot /mnt pacman -S git" erfolgreich ausführen, was mich Beides darauf schließen lässt, dass der Fehler mit diesem EOF Here Document zusammenhängt.
Ehrlich gesagt kenne ich mich mit diesem Befehl aber nicht weiter aus, und bin auch nicht in der Lage weiere (nützliche) Infos in diese Richtung zu finden.
Daher würde ich mich sehr freuen, wenn mir jemand, der sich damit besser auskennt erklärt wo es tatsächlich hakt?
Bis dahin werde ich das Problem wohl mit einem zweiten Script lösen, welches von dem ersten in die neue Umgebung kopiert und anschließend gestartet wird.
LG Marcel
`bash -xv` zeigt dir an, was passiert.
Wenn du auf der ersten Zeile "EOF" schreibst, funktioniert es:
# arch-chroot mnt /bin/bash -xv <<"EOF"
PKGS=(
# TERMINAL UTILITIES --------------------------------------------------
"vim" # Tab completion for Bash
)
for PKG in "${PKGS[@]}"; do
echo "INSTALLING: ${PKG}"
pacman -S ${PKG} --noconfirm
done
EOF
PKGS=(
# TERMINAL UTILITIES --------------------------------------------------
"vim" # Tab completion for Bash
)
+ PKGS=("vim")
for PKG in "${PKGS[@]}"; do
echo "INSTALLING: ${PKG}"
pacman -S ${PKG} --noconfirm
done
+ for PKG in "${PKGS[@]}"
+ echo 'INSTALLING: vim'
INSTALLING: vim
+ pacman -S vim --noconfirm
resolving dependencies...
looking for conflicting packages...
...
Sonst werden die Variablen vorher expandiert und sind darum leer:
# arch-chroot mnt /bin/bash -xv <<EOF
PKGS=(
# TERMINAL UTILITIES --------------------------------------------------
"vim" # Tab completion for Bash
)
for PKG in "${PKGS[@]}"; do
echo "INSTALLING: ${PKG}"
pacman -S ${PKG} --noconfirm
done
EOF
PKGS=(
# TERMINAL UTILITIES --------------------------------------------------
"vim" # Tab completion for Bash
)
+ PKGS=("vim")
for PKG in ""; do
echo "INSTALLING: "
pacman -S --noconfirm
done
+ for PKG in ""
+ echo 'INSTALLING: '
INSTALLING:
+ pacman -S --noconfirm
error: no targets specified (use -h for help)
Offline
Meine Bash-Programmierkenntnisse sind nicht die Besten, aber mir fällt auf, dass im Start der Schleife die Variable 'PKGS' benutzt wird, während in der Schleife in der pacman-Zeile lediglich steht 'PKG'.
Liegt es vielleicht daran?
Offline
Vielen Dank wirr
Damit funktioniert es auch bei mir, du hast mir echt eine Menge Arbeit erspart!
Aktuell bedrückt mich allerdings noch etwas.
Das Script ist (stark vereinfacht) folgendermaßen aufgebaut:
#!/binbash
...
...
disk=sda
hostname=arch-pc
...
...
sgdisk -n 2:0:0 ${disk}
...
...
arch-chroot mnt /bin/bash -xv <<"EOF"
echo $hostname > /etc/hostname
EOF
Während Variablen, die auserhalb des chroots genutzt werden (z.B "disk" für die Festplatte) einwandfrei funktionieren, sind genau diese Variablen für die Kommandos innerhalb des chroots nicht mehr verfuegbar (z.B "hostname" - in meinem Fall ist die Datei danach einfach leer).
Ist es möglich diese bereits vorhandenen Variablen, für den Code des chroots, zu implementieren?
LG Marcel
Meine Bash-Programmierkenntnisse sind nicht die Besten, aber mir fällt auf, dass im Start der Schleife die Variable 'PKGS' benutzt wird, während in der Schleife in der pacman-Zeile lediglich steht 'PKG'.
Liegt es vielleicht daran?
Nein, das müsste stimmen. "PKGS" ist sozusagenen die Gruppe. Und wir sagen: Für Mitglieder der Gruppe PKGS (also die einzelnen "PKG"s) führe "pacman -S $PKG" aus.
LG Marcel
Du kannst die Variablen exportieren, dann gelten sie auch in der neu gestarteten shell.
Offline