echo "text" > file 發生 Permission denied
若想寫一份內容簡單的文件,尤其是只有1行內容時,常會選用簡單的指令格式
echo "text" > file例如在test.txt中寫「abc」,常會選用簡單的指令
echo "abc" > text.txt 要創一個空檔案,也可以用
echo "" > empty_fileecho "text" > file 這種格式,真是建立輕量文字檔的好工具。但若使用者沒有寫檔案的資料夾權限時,會顯示「Permission denied」的錯誤訊息,告知權限不足,這時,若使用者為superdoer,直覺上,在前面加上「sudo」就好了。
sudo echo "text" > file
輸入後仍然顯示「Permission denied」,為什麼呢?
因為這種格式實際上有2個指令「echo」和「 > (寫入)」,擁有sudo權限的,只有接在sudo後面的echo指令,寫入的指令並未獲得。
要解決這樣的窘境,要利用
因為這種格式實際上有2個指令「echo」和「 > (寫入)」,擁有sudo權限的,只有接在sudo後面的echo指令,寫入的指令並未獲得。
要解決這樣的窘境,要利用
sh -c command 將shell執行指令完全寫出來,再加上sudo
sudo sh -c "echo text > file"
簡單了解系統中的sh是什麼?
$ whereis sh
sh: /bin/sh /bin/sh.distrib /usr/share/man/man1/sh.1.gz
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jun 19 2020 /bin/sh -> dash
發現sh預設為dash的連結,若習慣用bash的朋友們,是不是也習慣在shell腳本第一行寫上
不想用dash,除了將sh更改為bash的連結,也可以直接將sh改用/bin/bash取代
#!/bin/bash ?不想用dash,除了將sh更改為bash的連結,也可以直接將sh改用/bin/bash取代
sudo /bin/bash -c "echo text > file"
當然,/bin/已經被系統預設路徑所包函,所以可以省略/bin/
sudo bash -c "echo text > file"查看系統預設路徑有那些,可以查看環境參數PATH
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin補充 (2024/10/11)
比起使用
sudo /bin/bash -c "..."
更建議使用
sudo -s eval "..."
因為eval可以將現有終端機shell的設定引入,包括環境變數,會與在終端機內輸入的結果一致。
參考:Gilles 'SO的回答
留言
張貼留言