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 $1
steht 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 $1
leer ist, wird er zu einem leeren String erweitert, was zu einem awk
Programm führt, das nur seine Eingabe ausgibt:
awk '{print }'
Escapen Sie das $
in as $1
, \$1
um 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 $1
steht 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 bash
Versionen (Release 4.2+, also nicht mit demStandard bash
auf macOS, aber mit der Version, die zB überSelbstgebrautes),
printf '%(%a)T\n' -1
würde dasselbe tun, ohne externe Befehle aufzurufen.