Why I can't change directories using “cd”?

后端 未结 30 2287
眼角桃花
眼角桃花 2020-11-21 06:17

I\'m trying to write a small script to change the current directory to my project directory:

#!/bin/bash
cd /home/tree/projects/java

I save

相关标签:
30条回答
  • 2020-11-21 06:24

    Shell scripts are run inside a subshell, and each subshell has its own concept of what the current directory is. The cd succeeds, but as soon as the subshell exits, you're back in the interactive shell and nothing ever changed there.

    One way to get around this is to use an alias instead:

    alias proj="cd /home/tree/projects/java"
    
    0 讨论(0)
  • 2020-11-21 06:24

    Jeremy Ruten's idea of using a symlink triggered a thought that hasn't crossed any other answer. Use:

    CDPATH=:$HOME/projects
    

    The leading colon is important; it means that if there is a directory 'dir' in the current directory, then 'cd dir' will change to that, rather than hopping off somewhere else. With the value set as shown, you can do:

    cd java
    

    and, if there is no sub-directory called java in the current directory, then it will take you directly to $HOME/projects/java - no aliases, no scripts, no dubious execs or dot commands.

    My $HOME is /Users/jleffler; my $CDPATH is:

    :/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work
    
    0 讨论(0)
  • 2020-11-21 06:24

    I got my code to work by using. <your file name>

    ./<your file name> dose not work because it doesn't change your directory in the terminal it just changes the directory specific to that script.

    Here is my program

    #!/bin/bash 
    echo "Taking you to eclipse's workspace."
    cd /Developer/Java/workspace
    

    Here is my terminal

    nova:~ Kael$ 
    nova:~ Kael$ . workspace.sh
    Taking you to eclipe's workspace.
    nova:workspace Kael$ 
    
    0 讨论(0)
  • 2020-11-21 06:24

    This should do what you want. Change to the directory of interest (from within the script), and then spawn a new bash shell.

    #!/bin/bash
    
    # saved as mov_dir.sh
    cd ~/mt/v3/rt_linux-rt-tools/
    bash
    

    If you run this, it will take you to the directory of interest and when you exit it it will bring you back to the original place.

    root@intel-corei7-64:~# ./mov_dir.sh
    
    root@intel-corei7-64:~/mt/v3/rt_linux-rt-tools# exit
    root@intel-corei7-64:~#
    

    This will even take you to back to your original directory when you exit (CTRL+d)

    0 讨论(0)
  • 2020-11-21 06:24

    Note the discussion How do I set the working directory of the parent process?

    It contains some hackish answers, e.g. https://stackoverflow.com/a/2375174/755804 (changing the parent process directory via gdb, don't do this) and https://stackoverflow.com/a/51985735/755804 (the command tailcd that injects cd dirname to the input stream of the parent process; well, ideally it should be a part of bash rather than a hack)

    0 讨论(0)
  • 2020-11-21 06:26

    You can use the operator && :

    cd myDirectory && ls

    0 讨论(0)
提交回复
热议问题