Skript funktioniert nicht, wenn es über -c an Bash übergeben wird

Skript funktioniert nicht, wenn es über -c an Bash übergeben wird

Warum funktioniert das:

$ cat test.sh
#!/bin/bash
cat <(date|awk '{print $1}')

$ ./test.sh
Thu

aber nicht als an Bash übergebener Befehl:

$ bash -c "cat <(date|awk '{print $1}')"
Thu  2 Apr 2020 12:52:10 BST

Ich verwende dies auf macOS

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
Copyright (C) 2007 Free Software Foundation, Inc.

Antwort1

In Ihrem Einzeiler $1steht das in einer Zeichenfolge mit doppelten Anführungszeichen:

"cat <(date|awk '{print $1}')"

Das bedeutet, dass es von der interaktiven Shell erweitert wird. Wenn der erste Positionsparameter $1leer ist, wird er zu einem leeren String erweitert, was zu einem awkProgramm führt, das nur seine Eingabe ausgibt:

awk '{print }'

Escapen Sie das $in as $1, \$1um zu verhindern, dass die Shell versucht, es zu erweitern. Ihr vollständiger Befehl würde dann so aussehen:

bash -c "cat <(date|awk '{print \$1}')"

In Ihrer Skriptvariante $1steht es in einem String in einfachen Anführungszeichen. Die Shell wird daher nicht versuchen, es zu erweitern.

In diesem speziellen Fall wäre es jedoch besser, nur

date +%a

um den abgekürzten Namen des Tages auszudrucken. Siehe auch Handbuch strftime(3)( man 3 strftime).

In neueren bashVersionen (Release 4.2+, also nicht mit demStandard bashauf macOS, aber mit der Version, die zB überSelbstgebrautes),

printf '%(%a)T\n' -1

würde dasselbe tun, ohne externe Befehle aufzurufen.

verwandte Informationen