Doppelte Klammern [[mit Sudo

441
Brad Dwyer

Ich habe einen Befehl, der funktioniert, wenn er als aktueller Benutzer ausgeführt wird, aber wenn ich sudoden Befehl vorstelle, wird ein Fehler angezeigt.

Ich versuche, eine Datei zu entfernen, wenn es sich um ein Verzeichnis handelt (aber nicht, wenn es sich um einen Symlink zu einem Verzeichnis handelt). Das funktioniert großartig:

brad@ip-10-0-0-1:~$ [[ -d /path/to/my/place && ! -L /path/to/my/place ]] && rm -rf /path/to/my/place 

Wenn ich jedoch versuche, sudodies als Superbenutzer zu tun, erhalte ich eine Fehlermeldung, da es sich sudoscheinbar um [[einen Befehl handelt:

brad@ip-10-0-0-1:~$ sudo [[ -d /path/to/my/place && ! -L /path/to/my/place ]] && rm -rf /path/to/my/place sudo: [[: command not found 

Ich musste die doppelten Klammern hinzufügen, damit das ! -L /path/to/my/placeBit funktioniert; sudoIch habe vorher mit einzelnen Brackets gearbeitet, als ich lief

brad@ip-10-0-0-1:~$ sudo [ -d /path/to/my/place ] && rm -rf /path/to/my/place 

Aber jetzt, wo ich versuche zu prüfen, ob es sich nicht um einen symbolischen Link handelt, kann ich nicht damit arbeiten sudo. Wie kann ich entweder:

  • Holen Sie sich die doppelte Klammer-Syntax, um mit sudooder zu arbeiten
  • Erhalten Sie die einfache Klammer-Syntax, damit ich den -LTeil negieren kann ?
1

1 Antwort auf die Frage

1
Kamil Maciorowski
$ 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 sudokann. [[ist nicht. Sie müssen bashangeben [[:

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 -aund -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 Befehls testoder [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 zwei testoder [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 ] && … 
Ausgezeichnet! sudo bash -c ... funktionierte wie ein Zauber. Vielen Dank. Brad Dwyer vor 6 Jahren 0