"Sudo: sumber: perintah tidak ditemukan"

15
$ source /etc/environment 

$ sudo source /etc/environment 
[sudo] password for t: 
sudo: source: command not found

Tampaknya shell berbeda dari bashyang dijalankan untuk menjalankan source /etc/environmentdan shell itu tidak memiliki sourcebuiltin.

Tapi shell default saya dan root keduanya bash.

$ echo $SHELL
/bin/bash

Jika sudomemang menggunakan shell yang berbeda, mengapa? Saya melihat balasan slm , tetapi tidak mengerti dalam kasus saya.

StackExchange untuk Semua
sumber
4
sourceadalah shell builtin..Anda tidak dapat menggunakan sudountuk menjalankan shell builtin seperti perintah eksternal ..
heemayl
Apakah masalah yang Anda tidak bisa membaca file, atau bahwa Anda ingin lingkungan yang ditentukan dalam file berlaku untuk perintah sudo berikutnya?
Random832
@ Random832: ingin lingkungan yang ditentukan dalam file berlaku untuk perintah sudo berikutnya
StackExchange for All

Jawaban:

23

sourceadalah shell builtin, sehingga tidak dapat dijalankan tanpa shell. Namun, secara default, sudojangan jalankan shell. Darisudo

Model proses

Ketika sudo menjalankan perintah, ia memanggil fork (2), mengatur lingkungan eksekusi seperti yang dijelaskan di atas, dan memanggil panggilan sistem eksekusi dalam proses anak

Jika Anda ingin mengeksekusi shell secara eksplisit, gunakan -sopsi:

# sudo -s source /etc/environment

Yang masih tidak berguna karena setelah shell keluar, perubahan lingkungan hilang.

myaut
sumber
7

Dalam bidang penyelesaian masalah alih-alih menjawab pertanyaan , inilah cara yang paling jelas (bagi saya) untuk mencari file yang hanya dapat dibaca oleh root:

source <(sudo cat /etc/environment)

Ini menggunakan proses substitusi . Dibutuhkan output dari catperintah dan mengubahnya menjadi file pseudo, yang dapat Anda aksessource . sumber kemudian menjalankan perintah di shell saat ini.

Perhatikan bahwa pada sebagian besar sistem, /etc/environmentdapat dibaca dunia, jadi Anda harus dapat menjalankan ini:

source /etc/environment
Kevin
sumber
1
ini bekerja, yang diterima tidak
Claudiu Creanga
2

sudomengharapkan perintah tetapi Anda memberikan shell builtin sehingga tidak dapat menemukan perintah. Jika Anda menulis type source, Anda dapat melihat output: source is a shell builtindan output which sourcekosong.

Misalnya sudo straceakan bekerja dan which straceakan memberikan output karena strace adalah sebuah perintah.

Sunting: Juga, Anda dapat melihat sudo su;sudo source /etc/environmentberfungsi dengan baik sehingga shell yang berbeda tidak digunakan.

Esref
sumber