ls mit Platzhalter und Klammern funktioniert in der Konsole, aber nicht in einem Skript

ls mit Platzhalter und Klammern funktioniert in der Konsole, aber nicht in einem Skript

Befehl:

ls /etc/pve/lxc/*([0-9]).conf

Arbeiten in der Konsole:

  • Ergebnis: Datei gefunden!
/etc/pve/lxc/107.conf

aber nicht im Drehbuch:

  • #!/bin/bash
  • Ergebnis: FEHLER
syntax error near unexpected token `('
ls /etc/pve/lxc/*([0-9]).conf

Dann habe ich die Klammern im Skript maskiert:

ls /etc/pve/lxc/*\([0-9]\).conf
  • Ergebnis: Keine Datei gefunden
ls: cannot access '/etc/pve/lxc/*([0-9]).conf': No such file or directory

Antwort1

Der Ausdruck *([0-9]).confist ein KSH-Stilerweiterter Glob. Die Funktion ist standardmäßig für interaktive Bash-Shells aktiviert, aber um sie in einem Bash-Skript zu verwenden, muss sie explizit aktiviert werden mit

shopt -s extglob

Siehe auchPlatzhaltererweiterung, die in der Befehlszeile funktioniert, aber nicht in einem Bash-Skript

Antwort2

Die Information, die Sie nicht angeben, ist, welcher Befehlsinterpreter im Skript verwendet wird. Dies wird durch den Shebang angezeigt, also die erste Zeile (z. B. #/bin/sh).

In Ubuntu führt die Konsole standardmäßig Bash als interaktive Shell aus. Wenn Ihr Skript einen anderen Befehlsinterpreter verwendet, z. B. /bin/sh, funktioniert die für Bash spezifische Syntax nicht.

verwandte Informationen