Page 1 of 1

shell script works embedded, in Terminal - not as external

PostPosted: Thu Jun 12, 2025 4:04 pm
by speedy_99
:shock: The same shell script works as an embedded script and in the terminal.

If I link the shell script that works in the terminal as an external shell script in an action, it reports “error code 1” and terminates the script.

Why? :?:
What do I need to change so that the shell script works as an external shell script?

:arrow: Function of the “shell script”:
A PDF with a QR code is read with “zbarimg” and the content is edited with the commands and “sed”.
The result is appended as a new file name to the name of the input file (“$1”).

Input file: zz.pdf
Expected result: “zz_CK00038061.pdf”

embedded script
Code: Select all
# Überprüfen, ob ein Bildpfad als Argument übergeben wurde
if [ -z "$1" ]; then
    echo "Nutzung: $0 <Pfad_zum_QR-Code-Bild>"
    echo "Beispiel: $0 qrcode.png"
    exit 1
fi

# Den QR-Code aus dem Bild lesen und die Ausgabe filtern.
# Wir nutzen sed, um den festen Präfix "QR" gefolgt von 6 beliebigen Zeichen zu entfernen.
# Der folgende Text "CK" gefolgt von 8 Zahlen wird extrahiert.
# Die Zeile muss mit diesen 8 Zahlen enden.


result=$(zbarimg -Sdisable -Sqrcode.enable "$1" 2>/dev/null | sed -n 's/^[qQ][rR]......\([cC][kK][0-9]\{8\}\)$/\1/p' | tr '[:lower:]' '[:upper:]')

# Überprüfen, ob ein Ergebnis vorhanden ist
if [ -z "$result" ]; then
    echo "Kein QR-Code im Bild gefunden oder der Inhalt entspricht nicht dem erwarteten Format."
    exit 1
fi

# Dateipfad und Dateiname extrahieren
filepath=$(dirname "$1")
filename=$(basename "$1")
extension="${filename##*.}"
filename_no_ext="${filename%.*}"

# Sonderzeichen im ausgelesenen Ergebnis durch Unterstrich ersetzen,
# um einen gültigen Dateinamen zu gewährleisten.
sanitized_result=$(echo "$result" | sed -e 's/[\\/:*?\"<>|]//g' -e 's/ /_/g')

new_filename="${filename_no_ext}_${sanitized_result}.${extension}"

# Der vollständige neue Pfad
new_filepath="${filepath}/${new_filename}"

# Datei umbenennen
if mv "$1" "$new_filepath"; then
    echo "Datei wurde erfolgreich umbenannt zu: '$new_filepath'"
else
    echo "Fehler beim Umbenennen der Datei '$1'."
    exit 1
fi

echo "Der ausgelesene QR-Code-Inhalt war: '$result'"


external script
Code: Select all
#!/bin/zsh
# Überprüfen, ob ein Bildpfad als Argument übergeben wurde
if [ -z "$1" ]; then
    echo "Nutzung: $0 <Pfad_zum_QR-Code-Bild>"
    echo "Beispiel: $0 qrcode.png"
    exit 1
fi

# Den QR-Code aus dem Bild lesen und die Ausgabe filtern.
# Wir nutzen sed, um den festen Präfix "QR" gefolgt von 6 beliebigen Zeichen zu entfernen.
# Der folgende Text "CK" gefolgt von 8 Zahlen wird extrahiert.
# Die Zeile muss mit diesen 8 Zahlen enden.


result=$(zbarimg -Sdisable -Sqrcode.enable "$1" 2>/dev/null | sed -n 's/^[qQ][rR]......\([cC][kK][0-9]\{8\}\)$/\1/p' | tr '[:lower:]' '[:upper:]')

# Überprüfen, ob ein Ergebnis vorhanden ist
if [ -z "$result" ]; then
    echo "Kein QR-Code im Bild gefunden oder der Inhalt entspricht nicht dem erwarteten Format."
    exit 1
fi

# Dateipfad und Dateiname extrahieren
filepath=$(dirname "$1")
filename=$(basename "$1")
extension="${filename##*.}"
filename_no_ext="${filename%.*}"

# Sonderzeichen im ausgelesenen Ergebnis durch Unterstrich ersetzen,
# um einen gültigen Dateinamen zu gewährleisten.
sanitized_result=$(echo "$result" | sed -e 's/[\\/:*?\"<>|]//g' -e 's/ /_/g')

new_filename="${filename_no_ext}_${sanitized_result}.${extension}"

# Der vollständige neue Pfad
new_filepath="${filepath}/${new_filename}"

# Datei umbenennen
if mv "$1" "$new_filepath"; then
    echo "Datei wurde erfolgreich umbenannt zu: '$new_filepath'"
else
    echo "Fehler beim Umbenennen der Datei '$1'."
    exit 1
fi

echo "Der ausgelesene QR-Code-Inhalt war: '$result'"


Exit of shell script
Code: Select all
[color=#FF0000]# Überprüfen, ob ein Ergebnis vorhanden ist
if [ -z "$result" ]; then
    echo "Kein QR-Code im Bild gefunden oder der Inhalt entspricht nicht dem erwarteten Format."
    exit 1
fi[/color]


Debug.log
Code: Select all
2025-06-12 21:43:29.993 hazelworker[41531] Running worker (v6.0.4) for folder with identifier: 16777233-263544522.
2025-06-12 21:43:29.995 hazelworker[41531] ###Arch: arm64
2025-06-12 21:43:29.995 hazelworker[41531] ###main load address: 0x1002ac000
2025-06-12 21:43:29.995 hazelworker[41531] ###Hazel Core load address: 0x10047c000
2025-06-12 21:43:29.995 hazelworker[41531] ###Noodle load address: 0x10088c000
2025-06-12 21:43:29.995 hazelworker[41531] ###CK load address: 0x100364000
2025-06-12 21:43:30.000 hazelworker[41531] DEBUG: Program is licensed.
2025-06-12 21:43:30.406 hazelworker[41531] DEBUG: Error reading file /Users/mueller/Library/Application Support/Firefox/prefs.js: Error Domain=NSCocoaErrorDomain Code=260 "The file “prefs.js” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/Users/mueller/Library/Application Support/Firefox/prefs.js, NSURL=file:///Users/mueller/Library/Application%20Support/Firefox/prefs.js, NSUnderlyingError=0x6000032e7570 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
2025-06-12 21:43:30.407 hazelworker[41531] DEBUG: Could not find entry for default_directory in Chrome preference file.
2025-06-12 21:43:30.408 hazelworker[41531] DEBUG: Could not find entry for download in Chrome preference file.
2025-06-12 21:43:30.409 hazelworker[41531] Processing folder Test (forced)
2025-06-12 21:43:30.409 hazelworker[41531] DEBUG: Pausing to wait for things to settle down.
2025-06-12 21:43:32.484 hazelworker[41531] DEBUG: Processing directories: (
    "/Users/mueller/Downloads/Test"
)
2025-06-12 21:43:32.486 hazelworker[41531] DEBUG: Received file event: {
    date = "2025-06-12 19:43:29 +0000";
    path = "<NoodlePathSet: 0x600003cfcd00>\n  /Users/mueller/Downloads/Test : 18446744073709551615\n";
}
2025-06-12 21:43:32.486 hazelworker[41531] DEBUG: About to process directory /Users/mueller/Downloads/Test
2025-06-12 21:43:32.535 hazelworker[41531][PREDICTION] DEBUG: Calculating fire time - predicate: typeObject isType: "com.adobe.pdf" result: 1
2025-06-12 21:43:32.535 hazelworker[41531][PREDICTION] DEBUG: Next fire time: 4001-01-01 01:00:00.000
2025-06-12 21:43:32.535 hazelworker[41531][PREDICTION] DEBUG: Bail out: OR predicate
2025-06-12 21:43:32.537 hazelworker[41531][PREDICTION] DEBUG: Calculating fire time - predicate: displayBasename hazelMatchesPattern: ({anything:sc0:id0},(,{hazelcustomtoken:PN-12345678:(PN-:{digit:id0}:{digit:id0}:{digit:id0}:{digit:id0}:{digit:id0}:{digit:id0}:{digit:id0}:{digit:id0}):sc0:id0:cap},),{anything:sc0:id0}),{
} result: 0
2025-06-12 21:43:32.537 hazelworker[41531][PREDICTION] DEBUG: Next fire time: 4001-01-01 01:00:00.000
2025-06-12 21:43:32.537 hazelworker[41531][PREDICTION] DEBUG: Calculating fire time - predicate: labelColor !=[cd] 6 result: 1
2025-06-12 21:43:32.537 hazelworker[41531][PREDICTION] DEBUG: Next fire time: 4001-01-01 01:00:00.000
2025-06-12 21:43:32.537 hazelworker[41531][PREDICTION] DEBUG: Predicted fire time for file: /Users/mueller/Downloads/Test/zz.pdf and rule external - 02a_QR-CK8 auslesen, ren Datei mit QR-Inhalt anhängen - sanitized (Sonderzeichen löschen, Leerzeichen gegen "_" ersetzt): 4001-01-01 01:00:00.000 Should poll: 0
2025-06-12 21:43:32.537 hazelworker[41531] zz.pdf: Rule external - 02a_QR-CK8 auslesen, ren Datei mit QR-Inhalt anhängen - sanitized (Sonderzeichen löschen, Leerzeichen gegen "_" ersetzt) matched.
2025-06-12 21:43:32.537 hazelworker[41531] DEBUG: Manual run. Forcing actions to be executed.
2025-06-12 21:43:32.544 hazelworker[41531] DEBUG: == script output ==
Kein QR-Code im Bild gefunden oder der Inhalt entspricht nicht dem erwarteten Format.

== End script output ==
2025-06-12 21:43:32.544 hazelworker[41531] [Error] Shell script failed: Error processing shell script /Users/Shared/DMS-Hazel/Tools-DMS/Scripts/ZBar_qr_CK8stellig_BSD_ren-anhaengen_sanitized.sh on file /Users/mueller/Downloads/Test/zz.pdf.
2025-06-12 21:43:32.544 hazelworker[41531] Shellscript exited with non-successful status code: 1
2025-06-12 21:43:32.544 hazelworker[41531] DEBUG: Tapping error retry sequence
2025-06-12 21:43:32.544 hazelworker[41531] DEBUG: .DS_Store: File is hidden/invisible. Skipping.
2025-06-12 21:43:32.546 hazelworker[41531][PREDICTION] DEBUG: Calculating fire time - predicate: typeObject isType: "com.adobe.pdf" result: 0
2025-06-12 21:43:32.546 hazelworker[41531][PREDICTION] DEBUG: Next fire time: 4001-01-01 01:00:00.000
2025-06-12 21:43:32.546 hazelworker[41531][PREDICTION] DEBUG: Calculating fire time - predicate: typeObject isType: "public.image" result: 0
2025-06-12 21:43:32.546 hazelworker[41531][PREDICTION] DEBUG: Next fire time: 4001-01-01 01:00:00.000
2025-06-12 21:43:32.546 hazelworker[41531][PREDICTION] DEBUG: Bail out: AND predicate
2025-06-12 21:43:32.546 hazelworker[41531][PREDICTION] DEBUG: Predicted fire time for file: /Users/mueller/Downloads/Test/output and rule external - 02a_QR-CK8 auslesen, ren Datei mit QR-Inhalt anhängen - sanitized (Sonderzeichen löschen, Leerzeichen gegen "_" ersetzt): 4001-01-01 01:00:00.000 Should poll: 0
2025-06-12 21:43:32.546 hazelworker[41531] DEBUG: output: Did not match any rules.
2025-06-12 21:43:32.546 hazelworker[41531] DEBUG: Writing out DB file for /Users/mueller/Downloads/Test to path: /Users/mueller/Library/Application Support/Hazel/16777233-263544522.hazeldb
2025-06-12 21:43:32.547 hazelworker[41531] DEBUG: Directory /Users/mueller/Downloads/Test processed in 0.060882 seconds
2025-06-12 21:43:32.547 hazelworker[41531] DEBUG: Sending metrics to scheduler. Next scheduled run: 2025-06-12 21:48:32.544
2025-06-12 21:43:32.547 hazelworker[41531] Done processing folder Test

Re: shell script works embedded, in Terminal - not as extern

PostPosted: Fri Jun 13, 2025 8:56 am
by Mr_Noodle
Look into the zbarimg program to see if it needs any environment variables set. You should also use a full path there as well.

Re: shell script works embedded, in Terminal - not as extern

PostPosted: Fri Jun 13, 2025 9:13 am
by speedy_99
The shell script runs both as an embedded script in Hazel and in the Terminal app, i.e. as an external script, and it works.

The same test file is used in all cases.
The parameters in “zbarimg” seem to be correct after all. Right? :?:

“zbarimg program to see if it needs any environment variables”

Are the environment variables processed differently by Hazel embedded than by external scripts?
Differently than in the Terminal app? :?:

What changes when an external “shell script.sh” is called by Hazel instead of by the Terminal app? :?:

Doesn't Hazel pass the full path of a file to an external script? :?:

For example, Terminal:
Code: Select all
/Users/Shared/DMS-Hazel/Tools-DMS/Scripts/ZBar_qr_CK8stellig_BSD_ren-anhaengen_sanitized.sh /Users/dms_admin_p1/Downloads/Test_File.pdf


What does Hazel pass?
“keep in mind that  $1  returns the  full  path, not a relative path,”

Did I misunderstand the instructions? :?: