Seperti yang dijelaskan @geekosaur, shell melakukan pengalihan sebelum menjalankan perintah. Saat Anda mengetik ini:
sudo foo >/some/file
Proses shell Anda saat ini membuat salinannya sendiri yang pertama kali mencoba dibuka /some/fileuntuk penulisan, kemudian jika berhasil, deskriptor file tersebut akan menjadi keluaran standarnya, dan hanya jika berhasil, ia akan dieksekusi sudo. Ini gagal pada langkah pertama.
Jika Anda diizinkan (konfigurasi sudoer sering menghalangi menjalankan shell), Anda dapat melakukan sesuatu seperti ini:
sudo bash -c 'foo >/some/file'
Tapi saya menemukan solusi yang baik secara umum adalah dengan menggunakan | sudo teebukannya >dan | sudo tee -abukan >>. Itu sangat berguna jika pengalihan adalah satu-satunya alasan yang saya perlukan sudosejak awal; lagipula, menjalankan proses yang tidak perlu sebagai root adalah hal yang sudosebenarnya harus dihindari. Dan menjalankan echosebagai root itu konyol.
echo '[archlinuxfr]' | sudo tee -a /etc/pacman.conf >/dev/null
echo 'Server = http://repo.archlinux.fr/$arch' | sudo tee -a /etc/pacman.conf >/dev/null
echo ' ' | sudo tee -a /etc/pacman.conf >/dev/null
Saya menambahkan > /dev/nulldi akhir karena teemengirimkan output ke kedua file bernama dan output standar sendiri, dan saya tidak perlu melihatnya di terminal saya. ( teePerintah tersebut bertindak seperti konektor "T" dalam pipa fisik, yang merupakan asal namanya.) Dan saya beralih ke tanda kutip tunggal ( '... ') daripada tanda kutip ganda ( "... ") sehingga semuanya literal dan saya tidak perlu membuat garis miring terbalik di depan $dalam $arch. (Tanpa tanda kutip atau garis miring terbalik, $archakan digantikan oleh nilai parameter shell arch, yang mungkin tidak ada, dalam hal $archini diganti dengan tidak ada dan menghilang begitu saja.)
Sehingga menangani penulisan ke file sebagai root menggunakan sudo. Sekarang untuk penyimpangan panjang tentang cara menghasilkan teks yang mengandung baris baru dalam skrip shell. :)
Untuk BLUF, seperti yang mereka katakan, solusi pilihan saya adalah dengan memasukkan dokumen di sini ke dalam sudo teeperintah di atas ; maka tidak diperlukan catatau echoatau printfatau perintah lain sama sekali. Tanda kutip tunggal telah dipindahkan ke pengantar sentinel <<'EOF', tetapi memiliki efek yang sama di sana: isi diperlakukan sebagai teks literal, jadi $archdibiarkan sendiri:
sudo tee -a /etc/pacman.conf >/dev/null <<'EOF'
[archlinuxfr]
Server = http://repo.archlinux.fr/$arch
EOF
Tapi meski begitulah cara saya melakukannya, ada alternatif. Berikut ini beberapa di antaranya:
Anda dapat tetap menggunakan satu echoper baris, tetapi kelompokkan semuanya menjadi subkulit, jadi Anda hanya perlu menambahkan ke file satu kali:
(echo '[archlinuxfr]'
echo 'Server = http://repo.archlinux.fr/$arch'
echo ' ') | sudo tee -a /etc/pacman.conf >/dev/null
Jika Anda menambahkan -eke echo(dan Anda menggunakan shell yang mendukung ekstensi non-POSIX), Anda dapat menyematkan baris baru langsung ke dalam string menggunakan \n:
echo -e '[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' |
sudo tee -a /etc/pacman.conf >/dev/null
Tetapi seperti yang dikatakan di atas, itu bukanlah perilaku yang ditentukan POSIX; shell Anda mungkin hanya menggemakan literal -ediikuti dengan string dengan sekelompok literal \nsebagai gantinya. Cara POSIX untuk melakukannya adalah dengan menggunakan printfalih-alih echo; itu secara otomatis memperlakukan argumennya seperti echo -ehalnya, tetapi tidak secara otomatis menambahkan baris baru di akhir, jadi Anda harus menempelkan tambahan di \nsana juga:
printf '[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n \n' |
sudo tee -a /etc/pacman.conf >/dev/null
Dengan salah satu solusi tersebut, apa yang didapat perintah sebagai string argumen berisi urutan dua karakter \n, dan terserah pada program perintah itu sendiri (kode di dalam printfatau echo) untuk menerjemahkannya ke dalam baris baru. Di banyak shell modern, Anda memiliki opsi untuk menggunakan tanda kutip ANSI $'... ', yang akan menerjemahkan urutan seperti \nke dalam baris baru literal sebelum program perintah melihat string tersebut. Itu berarti string seperti bekerja dengan perintah apapun, termasuk tua polos -e-kurang echo:
echo $'[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' |
sudo tee -a /etc/pacman.conf >/dev/null
Namun, meskipun lebih portabel daripada echo -e, kutipan ANSI masih merupakan ekstensi non-POSIX.
Dan lagi, sementara itu semua adalah opsi, saya lebih suka tee <<EOFsolusi langsung di atas.