Not able to change directory from bash script despite sourcing [duplicate] - bash

This question already has answers here:
Why can't I change directories using "cd" in a script?
(33 answers)
Closed 2 years ago.
I have following 2 files:
file cd2vcaa (in path):
#! /bin/bash
cd /var/cache/apt/archives
file test.sh (in current directory):
#! /bin/bash
. cd2vcaa
From terminal, I am able to change directory with . cd2vcaa but not with ./test.sh
~$ cd2vcaa <-- no effect
~$ . cd2vcaa <-- changes directory
/var/cache/apt/archives$ cd <-- back to home directory
~$ ./test.sh <-- does not change directory though no error - why?
~$
Why is . cd2vcaa working from terminal but from within another script?
How can this problem be solved?

The test.sh runs in a separate shell when you invoke it using ./test.sh, so although the sourcing inside test.sh means that the cd command will affect the current directory in the shell in which test.sh runs, so for example any commands added at the end of test.sh would run with current directory /var/cache/apt/archives, it will not affect the parent shell (your login session).
If you invoke the test.sh by sourcing it (. test.sh), then no sub-shell is launched at either stage, and the directory is changed in your login session.
As discussed in the comments, if the aim is simply to have use of an interactive shell which is cd-ed to the specified directory (not necessarily the parent shell), then one option is just to put bash at the end of the test.sh in order to start an interactive subshell after the cd command has been run. On exit from this subshell, control will return to the login shell, still in its original working directory.

Related

Problem in executing user defining shell commmand

I am trying to learn the basics of shell. I used vim editro for creating my own list of commands to be executed. Here is the way I created the code
vi mycommands
then inside this file I wrote
cd Documents
I am using macOS Catalina which has zsh by default but switched to bash
So when I write the following command in the terminal:
$ sh +x mycommands
It shows
+cd Documents
The Documents has some files and directories but it is not changing directory.Where am I going wrong?
Any help will be greatly appreciated.
Scripts run like sh myscript execute in a separate sub-shell, not the current shell. Changing directory inside a script will not cause your shell to change directory. If you want to change directory in your shell, you need to run the commands in your shell.
To do that, run:
. ./myscript (sh, bash) or source ./myscript (bash).
See this question.

Enter to unix shell with specific working directory

I want to accomplish this:
[zsh]$ pwd
/home/user
*[zsh]$ bash # enter to a bash shell at the same time as `cd ~/Desktop`.
[bash]$ pwd
/home/user/Desktop
[bash]$ exit
[zsh]$ pwd
**/home/user
I would like to know if there is any way to enter to the unix shell at the same time as changing a directory to some specific path. It's important that:
Line * is supposed to be a single-line command for entering a shell and changing a directory,
After exist from any new shell, it's expected to return to the latest location as it was before entering to the shell, see line **.
Using subshells is also useful for changing the current working directory temporary:
% (cd ~/Desktop && bash)
One straightforward answer consists in using a bash configuration file switching to the proper directory. By creating a file ~/.my_bashrc containing a single line:
cd ~/Desktop
you can then just type:
bash --rcfile ~/.my_bashrc
in a terminal to open a new shell directly in the Desktop directory.
Of course you can add other commands in ~/.my_bashrc (aliases, etc.), like in any regular bashrc file.
Simply do this.
cd /home/user/Desktop && bash
This will try to change your current directory to /home/user/Desktop and if it succeeds changes the shell to bash else throws error.
I think answer of #hchbaw is a bit tricky. I've just found a more effective solution from run bash command in new shell and stay in new shell after this command executes. In my case I can use:
bash --rcfile <(echo "cd ~/Desktop")
You can use pushd and popd commands:
pushd ~/Desktop && bash ; popd
pushd in this case is like "remember and cd" - it adds new directory to the top of directory stack, making it current directory. Next you start bash and after you exit bash, popd takes you back to the directory remembered by pushd.
EDIT: changed && to ; for better error handling, as pointed out in comment.

Why can't I execute this simple shell script? [duplicate]

This question already has answers here:
Why can't I change directories using "cd" in a script?
(33 answers)
Closed 9 years ago.
I have a file called go in ~/
All I want to do is to be able to run go and have it cd to this other dir.
This is what the go file looks like:
$ cat go
#!/bin/bash
cd ~/Desktop/rs3
I ran the line $ chmod +x go
And then the line ./go to attempt to run the file.
If i put echo whatever in the file it will print whatever to the console, but the cd command never works.
Thanks.
It doesn't work because the script runs in a subshell, so the environment is different.
What you can do is to alias go='cd ~/Desktop/3s3' - as it's an alias, the shell performs the substitution and runs the cd on itself, as if you've just typed it.
You should define the alias in your ~/.bashrc, ~/.bash_profile or any file that gets sourced when you login.

Why does this sh shebang not work?

In the following script (saved as script.sh):
#!/bin/sh
cd $MY_PYTHON_WORKING_DIRECTORY
python script1.py
python script2.py
Then, when I try to run the command script.sh in my bash shell, I got the error bash: script.sh: command not found. Why does this not work as expected? If the first line of any scripts start by #! prefix, then the following path on the line is interpreted as a command, right? For your information, even if I changed my first line to #!/bin/bash, the same error still occurred. If I run the script as either sh script.sh or bash script.sh, then the script ran as expected.
Is there any way to run the script by just hitting script.sh?
One more question, between sh and bash, which should I use? I'm on OS X 10.8 and my default shell is currently set bash, but I wonder which one to use going forward.
Thanks.
First, make the script executable:
chmod u+x script.sh
Second, your current directory is not in your $PATH. Therefore, you have to run the script with a path (relative is enough):
./script.sh

bash shell $HOME assignment and script execution

I've just begun learning Unix and have so far encountered two elementary though difficult to resolve problems:
When I set HOME='' in a shell script to a designated directory, the current directory no longer seems to be recognized. That is, 'cd ~/' spits out the message: 'no such file or directory' message. Although, curiously enough, if aliases assignments are made within the script, a source call seems to activated them nonetheless. How come?
Ex:
$ more .profile
HOME="~/Documents/Basics/Unix/Unix_and_Perl_course"
cd $HOME
[...]
$ source .profile
-bash: cd: ~/Documents/Basics/Unix/Unix_and_Perl_course: No such file or directory
When I created a simple shell script via nano ('hello.sh'), I can't seem to execute it simply by typing 'hello.sh' in the terminal. This issue fails to resolve even after I 'chmod +x' the file. What's the problem?
Ex:
$ more hello.sh
# my first Unix shell script
echo "Hello World"
$ hello.sh
bash: hello.sh: command not found
Thanks!
You also don't want to 'overload' $HOME, the default location for HOME is always your home directory. If you goof with that, lots of things will break.
As far as hello.sh - thats because you don't have '.' in your $PATH. (Which is a good thing)
Try:
./hello.sh
If it says it can't execute
chmod 755 hello.sh
./hello.sh
~ = $HOME
. (pwd) is not in $PATH

Resources