Untuk tujuan eksperimen, saya membuat biner yang mencetak $PATH
, dan memanggil which
sebagai berikut:
#include <stdlib.h>
#include <stdio.h>
int main() {
char *path = getenv("PATH");
if (path)
printf("got a path: %s\n", path);
else
printf("got no path\n");
system("which which");
return 0;
}
ketika saya menjalankannya di lingkungan kosong melalui
env -i ./printpath
Saya mendapatkan hasil cetak berikut:
got no path
/usr/bin/which
Pertanyaan saya adalah:mengapa yang benar which
biner dipanggil, bahkan jika tidak ada $PATH
?
Jawaban yang Diterima:
Anda telah menggunakan system
fungsi, sehingga akan menggunakan shell lain untuk menjalankan perintah which which
. Dari man system
:
DESCRIPTION
system() executes a command specified in command by calling /bin/sh -c
command, and returns after the command has been completed. During exe‐
cution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT
will be ignored.
Jika Anda mengubah which which
perintah untuk echo $PATH
:
$ env -i ./a.out
got no path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Jika Anda mengubah kode untuk menggunakan execve
bukannya system
, Anda akan mendapatkan hasil yang diharapkan:
#include <stdlib.h>
#include <stdio.h>
int main() {
char *path = getenv("PATH");
if (path)
printf("got a path: %s\n", path);
else
printf("got no path\n");
execve("echo $PATH");
return 0;
}
Kompilasi dan jalankan:
$ gcc test.c && env -i ./a.out
got no path
Situasi Mengerikan – Sistem File Dipasang Secara Bersamaan Oleh Beberapa Instans Os Independen?
Menggunakan Layar Gnu, Saya Mendapatkan Prompt Mentah Dengan Garis Miring Balik?