127 Kembalikan kode dari $?

291

Apa arti dari nilai pengembalian 127 dari $? dalam UNIX.

Sachin Chourasiya
sumber

Jawaban:

428

Nilai 127 dikembalikan oleh /bin/shketika perintah yang diberikan tidak ditemukan dalam PATHvariabel sistem Anda dan itu bukan perintah built-in shell. Dengan kata lain, sistem tidak memahami perintah Anda, karena tidak tahu di mana menemukan biner yang Anda coba panggil.

Oldskool
sumber
55
Ini juga terjadi jika skrip bash tidak memiliki mode "+ x" tetapi memang ada.
MatthewKremer
3
Anda dapat mencoba menggunakan which [program]untuk melihat biner OS mana yang digunakan. Jika muncul kosong, langkah selanjutnya adalah memeriksa bit eksekusi dan PATH.
four43
10
@ cr125rider, whichtidak terlalu akurat - ia tidak tahu tentang alias, fungsi shell, memoisasi pencarian PATH, atau faktor internal lainnya ke keadaan shell. Jauh lebih baik untuk digunakan type, shell builtin yang mengetahui semua hal itu.
Charles Duffy
5
Ini juga terjadi pada saya dengan file yang memiliki umpan baris Windows. Mengoreksi akhir baris ke format unix memecahkan masalah
Mitkins
4
@ MatthewKremer: Sebenarnya, saya mendapatkan 126( Permission denied), tidak 127ketika saya mencoba untuk memanggil file yang tidak dapat dieksekusi (terlepas dari isinya); sama halnya, upaya untuk mengeksekusi direktori juga menghasilkan 126( is a directory).
mklement0
58

Secara umum itu berarti:

127 - perintah tidak ditemukan

tetapi juga bisa berarti bahwa perintah itu ditemukan ,
tetapi perpustakaan yang diperlukan oleh perintah TIDAK ditemukan .

okigan
sumber
14

127 - command not found

contoh: $ caat Pesan kesalahan akan

pesta:

caat: perintah tidak ditemukan

sekarang Anda periksa menggunakan echo $?

Anitha Mani
sumber
10

Sebuah konvensi shell adalah bahwa executable yang sukses harus keluar dengan nilai 0. Hal lain dapat diartikan sebagai kegagalan semacam, pada bagian dari bash atau executable Anda yang baru saja berlari. Lihat juga $ PIPESTATUS dan bagian EXIT STATUS di halaman bash man:

   For  the shell’s purposes, a command which exits with a zero exit status has succeeded.  An exit status
   of zero indicates success.  A non-zero exit status indicates failure.  When a command terminates  on  a
   fatal signal N, bash uses the value of 128+N as the exit status.
   If  a command is not found, the child process created to execute it returns a status of 127.  If a com-
   mand is found but is not executable, the return status is 126.

   If a command fails because of an error during expansion or redirection, the exit status is greater than
   zero.

   Shell  builtin  commands  return  a  status of 0 (true) if successful, and non-zero (false) if an error
   occurs while they execute.  All builtins return an exit status of 2 to indicate incorrect usage.

   Bash itself returns the exit status of the last command executed, unless  a  syntax  error  occurs,  in
   which case it exits with a non-zero value.  See also the exit builtin command below.
apbianco
sumber
8

Tidak memiliki arti khusus, selain itu proses terakhir untuk keluar melakukannya dengan status keluar 127.

Namun, ini juga digunakan oleh bash (dengan asumsi Anda menggunakan bash sebagai shell) untuk memberi tahu Anda bahwa perintah yang Anda coba jalankan tidak dapat dieksekusi (yaitu tidak dapat ditemukan). Sayangnya itu tidak dapat langsung dikurangkan, jika proses keluar dengan status 127, atau jika tidak dapat ditemukan.

EDIT:
Tidak dapat langsung dikurangkan, kecuali untuk output di konsol, tapi ini stack overflow, jadi saya menganggap Anda melakukan ini dalam sebuah skrip.

Falstro
sumber
2

Kesalahan ini terkadang menipu. Dikatakan file tidak ditemukan meskipun file tersebut memang ada. Bisa jadi karena karakter khusus yang tidak dapat dibaca yang ada dalam file yang dapat disebabkan oleh editor yang Anda gunakan. Tautan ini mungkin membantu Anda dalam kasus-kasus seperti itu.

-bash: ./my_script: / bin / bash ^ M: interpreter buruk: Tidak ada file atau direktori

Cara terbaik untuk mengetahui apakah ini masalah adalah dengan menempatkan pernyataan gema di seluruh file dan memverifikasi apakah ada kesalahan yang sama.

Rama Sastry
sumber
1

Jika Anda mencoba menjalankan program menggunakan bahasa scripting, Anda mungkin perlu menyertakan path lengkap bahasa scripting dan file yang akan dieksekusi. Sebagai contoh:

exec('/usr/local/bin/node /usr/local/lib/node_modules/uglifycss/uglifycss in.css > out.css');
Nick
sumber
Terima kasih, ini berhasil untuk saya. Jadi saya melakukan yang gs dan kemudian menggunakan jalur output dalam skrip saya. Bekerja ..
Juan
0

Jika mainframe IBM JCL memiliki beberapa karakter atau angka tambahan di akhir nama skrip unix yang dipanggil, maka ia dapat melempar kesalahan tersebut.

Smart Coder
sumber