echo "text" > file 發生 Permission denied

若想寫一份內容簡單的文件,尤其是只有1行內容時,常會選用簡單的指令格式 echo "text" > file
例如在test.txt中寫「abc」,常會選用簡單的指令 echo "abc" > text.txt 
要創一個空檔案,也可以用 echo "" > empty_file

echo "text" > file 這種格式,真是建立輕量文字檔的好工具。

但若使用者沒有寫檔案的資料夾權限時,會顯示「Permission denied」的錯誤訊息,告知權限不足,這時,若使用者為superdoer,直覺上,在前面加上「sudo」就好了。
sudo echo "text" > file
輸入後仍然顯示「Permission denied」,為什麼呢?
因為這種格式實際上有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腳本第一行寫上 #!/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的回答

留言

這個網誌中的熱門文章

Python的10進制與16進制轉換

設定CPU的Cache模式:MTRR

ls -l 顯示出現亂碼