$ type -a [ [ is a shell builtin [ is /usr/bin/[ $ type -a [[ [[ is a shell keyword $
Wie Sie sehen können, [
ist es ein regulärer Befehl, der verwendet werden sudo
kann. [[
ist nicht. Sie müssen bash
angeben [[
:
sudo bash -c '[[ -d /path/to/my/place && ! -L /path/to/my/place ]]' && …
Da [[
es sich um ein Shell-Schlüsselwort handelt, erkennt der Parser es und ändert das Verhalten &&
zwischen [[
und ]]
. Sie können &&
inside nicht verwenden, [ … ]
weil es [
als Befehl fungiert und ]
tatsächlich das letzte an ihn übergebene Argument ist. Mit &&
innen bedeutet, es gibt zwei Befehle, die falsch ist.
Allerdings [
unterstützt -a
, so dass dies kann funktionieren:
sudo [ -d /path/to/my/place -a ! -L /path/to/my/place ] && …
Sie sollten es jedoch vermeiden. Aus diesem Artikel :
Die binäre
-a
und-o
[…] sind XSI-Erweiterungen zum POSIX-Standard. Alle sind in POSIX-2008 als veraltet gekennzeichnet. Sie sollten nicht in neuem Code verwendet werden. Eines der praktischen Probleme mit[ A = B -a C = D ]
(oder-o
) besteht darin, dass POSIX die Ergebnisse eines Befehlstest
oder[
mit nicht mehr als 4 Argumenten angibt . Es funktioniert wahrscheinlich in den meisten Muscheln, aber man kann sich nicht darauf verlassen. Wenn Sie für POSIX-Shells schreiben müssen, sollten Sie stattdessen zweitest
oder[
Befehle verwenden, die durch einen&&
Operator getrennt sind .
Dies sollte also sicherer sein, wenn Sie Folgendes verwenden möchten [
:
sudo [ -d /path/to/my/place ] && sudo [ ! -L /path/to/my/place ] && …