mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Updated SC2024 (markdown)
33
SC2024.md
33
SC2024.md
@@ -1,9 +1,32 @@
|
|||||||
# SC2024 sudo doesn't affect redirects. Use ..| sudo tee file
|
## sudo doesn't affect redirects. Use ..| sudo tee file
|
||||||
|
|
||||||
## Problematic Code:
|
### Problematic code:
|
||||||
|
|
||||||
sudo echo 'export FOO=bar' > /etc/profile
|
sudo echo 'export FOO=bar' >> /etc/profile
|
||||||
|
|
||||||
## Correct Code:
|
### Correct code:
|
||||||
|
|
||||||
echo 'export FOO=bar' | sudo tee /etc/profile > /dev/null
|
echo 'export FOO=bar' | sudo tee -a /etc/profile > /dev/null
|
||||||
|
|
||||||
|
### Rationale:
|
||||||
|
|
||||||
|
Redirections are performed by the current shell before `sudo` is started. This means that it will use the current shell's user and permissions to open and write to the file.
|
||||||
|
|
||||||
|
`tee` is a simple command that opens and writes to files without help from the shell, which means that it will use the permissions that `sudo` grants it.
|
||||||
|
|
||||||
|
There is nothing special about `tee`. It's just the simplest command that can both truncate and append to files without help from the shell. Here are equivalent alternatives:
|
||||||
|
|
||||||
|
Truncating:
|
||||||
|
|
||||||
|
echo 'data' | sudo dd of=file
|
||||||
|
echo 'data' | sudo sed 'w file'
|
||||||
|
|
||||||
|
Appending:
|
||||||
|
|
||||||
|
echo 'data' | sudo awk '{ print $0 >> "file" }'
|
||||||
|
echo 'data' | sudo sh -c 'cat >> file'
|
||||||
|
|
||||||
|
|
||||||
|
### Contraindications
|
||||||
|
|
||||||
|
If you want to run a command as root but redirect as the normal user, you can ignore this message.
|
Reference in New Issue
Block a user