mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Created SC2232 (markdown)
33
SC2232.md
Normal file
33
SC2232.md
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
## Can't use sudo with builtins like cd. Did you want sudo sh -c .. instead?
|
||||||
|
|
||||||
|
### Problematic code:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo cd /root
|
||||||
|
pwd
|
||||||
|
```
|
||||||
|
|
||||||
|
### Correct code:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
sudo sh -c 'cd /root && pwd'
|
||||||
|
```
|
||||||
|
### Rationale:
|
||||||
|
|
||||||
|
Due to the Unix process model, `sudo` can only change the privileges of a new, external process. It can not grant privileges to a currently running process.
|
||||||
|
|
||||||
|
This means that shell builtins -- commands that are interpreted by the current shell rather than through program invocation -- cannot be run with `sudo`. This includes `cd`, `source`, `read`, and others.
|
||||||
|
|
||||||
|
Instead you can run a shell with `sudo`, and have that shell run the builtins you want. Just be aware that what happens in that shell stays in that shell:
|
||||||
|
|
||||||
|
sudo sh -c 'cd /root && pwd' # This shows /root
|
||||||
|
pwd # This shows the original directory
|
||||||
|
|
||||||
|
### Exceptions:
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
### Related resources:
|
||||||
|
|
||||||
|
* [SuperUser](https://superuser.com/questions/241129/why-wont-sudo-cd-work): Why won't “sudo cd” work?
|
||||||
|
* Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!
|
Reference in New Issue
Block a user