Change the current directory from a Bash script Change the current directory from a Bash script bash bash

Change the current directory from a Bash script


When you start your script, a new process is created that only inherits your environment. When it ends, it ends. Your current environment stays as it is.

Instead, you can start your script like this:

. myscript.sh

The . will evaluate the script in the current environment, so it might be altered


You need to convert your script to a shell function:

#!/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}

The reason is that each process has its own current directory, and when you execute a program from the shell it is run in a new process. The standard "cd", "pushd" and "popd" are builtin to the shell interpreter so that they affect the shell process.

By making your program a shell function, you are adding your own in-process command and then any directory change gets reflected in the shell process.


In light of the unreadability and overcomplication of answers, i believe this is what the requestor should do

  1. add that script to the PATH
  2. run the script as . scriptname

The . (dot) will make sure the script is not run in a child shell.