247 Stimmen

Wechseln des aktuellen Verzeichnisses aus einem Bash-Skript

Ist es möglich, das aktuelle Verzeichnis aus einem Skript heraus zu wechseln?

Ich möchte ein Dienstprogramm für die Verzeichnisnavigation in der Bash erstellen. Ich habe ein Testskript erstellt, das wie das folgende aussieht:

#!/bin/bash
cd /home/artemb

Wenn ich das Skript über die Bash-Shell ausführe, ändert sich das aktuelle Verzeichnis nicht. Ist es überhaupt möglich, das aktuelle Shell-Verzeichnis von einem Skript aus zu ändern?

2 Stimmen

Nur ein Verbesserungsvorschlag: Wenn Sie pushd (möglicherweise umgeleitet zu >/dev/null um seine Ausgabe zu unterdrücken) anstelle von cd können Sie später in das vorherige Verzeichnis zurückkehren mit popd .

0 Stimmen

276voto

Norbert Hartl Punkte 10085

Wenn Sie Ihr Skript starten, wird ein neuer Prozess erstellt, der nur Ihre Umgebung erbt. Wenn er endet, endet er. Ihre aktuelle Umgebung bleibt unverändert.

Stattdessen können Sie Ihr Skript wie folgt beginnen:

. myscript.sh

El . wird das Skript in der aktuellen Umgebung ausgewertet, so dass es geändert werden kann

209voto

winden Punkte 2497

Sie müssen Ihr Skript in eine Shell-Funktion umwandeln:

#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
#   . ~/bin/myprog.sh
#

function myprog() {
  A=$1
  B=$2
  echo "aaa ${A} bbb ${B} ccc"
  cd /proc
}

Der Grund dafür ist, dass jeder Prozess sein eigenes aktuelles Verzeichnis hat, und wenn Sie ein Programm von der Shell ausführen, wird es in einem neuen Prozess ausgeführt. Die Standardbefehle "cd", "pushd" und "popd" sind in den Shell-Interpreter eingebaut, so dass sie den Shell-Prozess betreffen.

Indem Sie Ihr Programm zu einer Shell-Funktion machen, fügen Sie Ihren eigenen prozessinternen Befehl hinzu, und jeder Verzeichniswechsel wird dann im Shell-Prozess berücksichtigt.

62voto

In Anbetracht der Unlesbarkeit und Überkompliziertheit der Antworten sollte der Antragsteller meiner Meinung nach Folgendes tun

  1. fügen Sie dieses Skript in die PATH
  2. führen Sie das Skript als . scriptname

El . (Punkt) stellt sicher, dass das Skript nicht in einer Child-Shell ausgeführt wird.

52voto

MergerMan Punkte 465

Wenn Sie die obigen Angaben zusammenfassen, können Sie einen Alias erstellen

alias your_cmd=". your_cmd"

wenn Sie nicht jedes Mal das führende "." schreiben wollen wenn Sie Ihr Skript an die Shell-Umgebung übergeben wollen, oder wenn Sie sich einfach nicht daran erinnern wollen, dass Sie das tun müssen damit das Skript korrekt funktioniert.

35voto

akarca Punkte 1341

Wenn Sie die Bash verwenden, können Sie es mit alias versuchen:

in die Datei .bashrc diese Zeile einfügen:

alias p='cd /home/serdar/my_new_folder/path/'

wenn Sie "p" in die Befehlszeile schreiben, wird das Verzeichnis gewechselt.

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