Beim Versuch, drush auszuführen: ": Keine solche Datei oder kein solches Verzeichnis"

7

Ich habe den ganzen Tag meinen Kopf gegen die Wand geschlagen, um herauszufinden, warum Drush plötzlich aufgehört hat zu arbeiten.

Ich habe über Composer neu installiert, verschiedene Versionen ausprobiert, immer den gleichen Fehler.

Wenn ich tippe, which drushbekomme ich /home/user/.composer/vendor/bin/drushwas richtig ist.

Wenn ich sh -vx drushversuche zu debuggen, was mit dem Skript passiert, erhalte ich die folgende Ausgabe:

#!/usr/bin/env sh
#
# This script is a simple wrapper that will run Drush with the most appropriate
# php executable it can find.
#
# Solaris users: Add /usr/xpg4/bin to the head of your PATH
#

+ 
: not found/.composer/vendor/bin/drush: 8: /home/user/.composer/vendor/bin/drush: 
# Get the absolute path of this executable
SELF_DIRNAME="`dirname -- "$0"`"
+ dirname -- /home/user/.composer/vendor/bin/drush
+ SELF_DIRNAME=/home/user/.composer/vendor/bin
SELF_PATH="`cd -P -- "$SELF_DIRNAME" && pwd -P`/`basename -- "$0"`"
+ cd -P -- /home/user/.composer/vendor/bin
/home/user/.composer/vendor/bin/drush: 1: cd: can't cd to /home/user/.composer/vendor/bin
+ basename -- /home/user/.composer/vendor/bin/drush
+ SELF_PATH=/drush

+ 
: not found/.composer/vendor/bin/drush: 12: /home/user/.composer/vendor/bin/drush: 
# Decide if we are running a Unix shell on Windows
if `which uname > /dev/null 2>&1`; then
  case "`uname -a`" in
/home/user/.composer/vendor/bin/drush: 15: /home/user/.composer/vendor/bin/drush: Syntax error: word unexpected (expecting "in")

wut

Ok, vielleicht wird etwas Wonky zurückgegeben uname -a? Die Antwort von meinem Server lautet:

Linux servername 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 17:37:58 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Es gibt keine Probleme mit der Verzeichnisberechtigung ... alles gehört dem Benutzer. Ich bin völlig ratlos. Ich habe versucht, Drush 5, 6 und 7 - jeweils die gleiche Art von Fehler.

Auf dem Server wird Ubuntu 12.04.2 LTS ausgeführt

jmking
quelle

Antworten:

4

Ich habe den gleichen Fehler erhalten, als ich Drush-Befehle auf einem Remotecomputer über einen Drush-Alias ​​ausgeführt habe. Ich könnte die gleichen Drush-Befehle ohne Probleme direkt auf dem Remote-System ausführen, aber wenn ich versuchen würde, sie über einen Drush-Alias ​​(@remotesystem) auszuführen, würde ich diesen Fehler erhalten.

Ich fand heraus, dass der Benutzer auf der Standard-Shell des Remote-Systems sh und nicht bash war. Da die Bash-Konfigurationsdatei ~ / .bashrc die Zeile enthält, die die Position von Drush zum Pfad hinzufügt, konnte die Sh-Shell Drush nicht finden, da ~ / .bashrc nicht nur von Bash von der Sh-Shell bezogen wird.

In den Anweisungen zur Installation von drush auf docs.drush.org heißt es :

Fügen Sie nun Drush zu Ihrem Systempfad hinzu, indem Sie export PATH = "$ HOME / .composer / vendor / bin: $ PATH" in Ihr ~ / .bash_profile (Mac OS-Benutzer) oder in Ihr ~ / .bashrc (Linux-Benutzer) einfügen .

Sie können überprüfen, auf was Ihre aktuelle Shell eingestellt ist, indem Sie Folgendes ausführen:

export | grep SHELL

Dadurch wird eine Zeile mit Ihrer aktuellen Shell wie folgt gedruckt:

deklariere -x SHELL = "/ bin / bash"

Unter Ubuntu ist die Standard-Shell sh, aber die Standard-User-Shell ist bash. Dies geschah bei einer Ubuntu Server-Installation (keine GUI).

Um dies zu beheben, ändern Sie Ihre Standard-Shell in Bash.

Führen Sie für aktuelle Benutzer Folgendes aus, um die Standard-Shell zu ändern:

sudo -u <USERNAME> chsh -s /bin/bash

Wenn Sie für zukünftige Benutzer useradd verwenden, bearbeiten Sie die Skelettdatei / etc / default / useradd (vergessen Sie jedoch nicht, ein Backup zu erstellen). Ändern Sie die Zeile:

SHELL = / bin / sh

zu

SHELL = / bin / bash

Dadurch wird bash als Shell für neue Benutzer festgelegt, die erstellt werden.

frederickjh
quelle
Das ist verrückt. Wenn das Skript hat #!/usr/bin/env sh, muss es sh-kompatibel sein. Das Überschreiben SHELLmitten in einer Sitzung ist sowieso völlig sinnlos.
Tripleee
@tripleee Das Skript ist shkompatibel. Das Problem ist, dass die sh-Shell in einem nicht interaktiven Login keinen Drush im Pfad hat, aber die Bash-Shell hat Drush im Pfad. Eine andere Lösung wäre, den Pfad für die sh-Shell so zu konfigurieren, dass sie während einer nicht interaktiven Sitzung Drush findet. Ich führe andere nicht interaktive Bash-Befehle auf Servern aus und bevorzuge die Bash-Shell. Deshalb mache ich es so, dh. Ändern Sie die Shell für nicht interaktive Sitzungen.
frederickjh
Du bist immer noch verwirrt. Die PATHVariable für shwird .profilefür Login-Shells festgelegt und normalerweise von Nicht-Login-Shells geerbt. Allerdings, wenn Ihr Login keine Anmeldung beinhaltet Shell (wie es der Fall mit einigen Windowing - Systemen) Sie haben die `PATH' separat zu initialisieren ... oder einfach nur einen hartcodierten Pfad zum aktuellen Standort des Befehls verwenden Sie will rennen.
Tripleee
Diese Lösung ist nicht akzeptabel. Es kann nicht in einer gemeinsam genutzten Umgebung oder in einer Situation verwendet werden, in der Benutzer keine Berechtigung zum Ändern der Standard-Shell haben. Ich habe eine Lösung veröffentlicht, die die Verwendung der %drush-scriptin der path-aliases.
Asiby
1

Drush kann nicht gefunden werden, da $ PATH nicht den Pfad zu Drush angibt, sodass der Fehler env: drush: No such file or directoryauftritt. In der akzeptierten Antwort liegt dies daran, dass eine andere Shell verwendet wird, aber es gibt noch andere mögliche Ursachen und Lösungen.

Wenn Sie beispielsweise Drush auf einer Remote-Site über Drush-Aliase ausführen, kann es zu Problemen mit SSH und der nicht interaktiven Nichtanmeldung dieser Shell-Verbindung kommen. Wenn also Ihr $ PATH definiert ist ~/.bash_profileund nicht geladen wird Das Verschieben der $ PATH-Definition nach~/.bashrc kann in diesem Fall eine Lösung sein.

Alec
quelle
Das hat funktioniert. Vielen Dank. Ich verwende eine gemeinsam genutzte Umgebung, in der das Ändern der Standard-Shell nicht in Frage kommt. Außerdem habe ich keinen Zugriff auf etwas außerhalb meines $ HOME-Verzeichnisses. Die von @alec vorgeschlagene Lösung funktionierte sofort.
Asiby
Ich habe jedoch eine Lösung gefunden, die besser sein könnte.
Asiby
0

Wenn Sie sicher sind, dass der Pfad zu Drush korrekt ist, erteilen Sie die Ausführungsberechtigung für Drush-Binärdateien.

chmod a+x drush
Siva Epari
quelle
Ja - der Pfad ist korrekt und Drush ist ausführbar.
jmking
0

Möglicherweise wird es durch Dos-Line-Endungen verursacht. Sie können das Problem beheben, indem Sie diese Datei drush in vim bearbeiten und ": set ff = unix" unter Bezugnahme auf Ihre Frage zu github ausführen

Wenn die oben genannte Lösungsdosis nicht funktioniert, versuchen Sie Folgendes:

sudo mkdir /var/mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

Darüber hinaus müssen Sie möglicherweise Ihre php.ini-Einstellungen anpassen, bevor Sie drush erfolgreich verwenden können. Hier ist die Referenz

rfegade
quelle
0

In meinem Fall habe ich das Drush Crom Vendor Directory entfernt und es hat geholfen.

In meinem Pfad gab es viele Fälle von Drush.

Kristof
quelle
0

Um dieses spezielle Problem zu lösen, das ich auch hatte, müssen Sie lediglich eine drush-aliasesKonfiguration bereitstellen , wie im folgenden Beispiel gezeigt ...

$aliases['prod'] = array (
  'uri' => '...',
  'root' => '...',
  'remote-host' => '...',
  'remote-user' => '...',
  'os' => '...',
  'path-aliases' => array(
    '%drush-script' => '/home/user/.composer/vendor/bin/drush', // <-- This is what you need
  ),
);

Danach müssen Sie möglicherweise den Cache mit löschen drush cc drushund es erneut versuchen.

Das hat bei mir funktioniert.

Asiby
quelle