2 Stimmen

cd kann nicht wie vorgesehen innerhalb eines Bash-Skripts verwendet werden

Betrachten Sie dieses Skript, das ich geschrieben habe und das in das übergeordnete Verzeichnis gehen soll, wenn kein Argument angegeben wird (der if ... Teil).

#/bin/bash

if (($# == 0))
then
  cd ..
else
  for basename
  do
    cd ${PWD%$basename*}$basename
  done
fi

Das Problem ist, dass wenn ich es wie folgt ausführe

./up.sh

wird die cd in einer Subshell ausgeführt, wodurch sie nutzlos wird.

Wenn ich das Skript mit source Es funktioniert, aber ich möchte es nicht auf diese Weise aufrufen (es macht den Aufruf des Skripts zu kompliziert, außerdem würde man erwarten, dass es direkt aufgerufen wird, wenn es im PATH gefunden wird).

3voto

phihag Punkte 261131

Ein beliebiges Programm (z.B. Ihr Bash-Programm) kann das Arbeitsverzeichnis des Elternprozesses nicht ändern, da dies so ziemlich alle bestehenden Prozesse, die Kinder erzeugen, zerstören würde.

Sie sollten eine Bash-Alias o Funktion stattdessen. Wie Sie bereits festgestellt haben, ist die Eingabe von source ./up.sh (oder kürzer: . ./up.sh ) funktioniert auch.

3voto

sehe Punkte 346808

Ich schlage vor, eine Funktion statt eines Skripts zu verwenden

function myscript()
{
     // use $1, $2, "$@" as usual in scripts

     local v1="bla"       # can use globals
     export PATH="$PATH"  # but global shell env too

     somedirectory=.. 
     cd $somedirectory
}

Alternativ dazu, alias würde funktionieren (aber es unterstützt Umleitung, Argumentübergabe, Flusskontrolle usw. nicht gut, und man kann sie nicht in $() IIRC).

Zuletzt wird das vorhandene Skript in der aktuellen Shell wie folgt gesourced:

source ./script.sh

ksh und bash haben Abkürzungen dafür:

. ./script.sh

Hüten Sie sich jedoch vor Skripten mit 'exit'-Anweisungen: Sie beenden die übergeordnete Shell!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X