Saya telah menguji bash dan menemukan kode berikut:

#!/bin/bash

[[ `which pacman` ]] && echo pacman
[[ `which apt-get` ]] && echo apt-get

Ini akan menguji manajer paket apa yang diinstal dan menggemakannya.

Pada beberapa sistem, perintah which yang gagal mencetak kesalahan ke stderr. Saya ingin menekan semua output dari perintah which.

Jadi saya datang dengan kode berikut:

#!/bin/bash

[[ `which pacman >/dev/null 2>&1` ]] && echo pacman
[[ `which apt-get >/dev/null 2>&1` ]] && echo apt-get

Tapi ini tidak menghasilkan apa-apa. Ketika saya menjalankan setiap perintah pada baris perintah seperti ini:

which pacman >/dev/null 2>&1 && echo $?

Pada sistem dengan pacman, ia mencetak 0 yang seharusnya. && juga membuktikan bahwa perintah sebelumnya berhasil.

Jadi mengapa kode pengalihan tidak berfungsi seperti pada baris perintah? Apa yang bisa saya tambahkan ke skrip untuk membuatnya berfungsi?

Ini benar-benar membingungkan bagi saya, karena saya belum pernah mengalami masalah seperti ini sebelumnya. Biasanya, perintah apa pun yang berfungsi pada baris perintah juga harus berfungsi di skrip bash, bukan?

0
Deanie 12 Mei 2021, 18:41

1 menjawab

Jawaban Terbaik

[[ ... ]] tanpa pengujian tertentu berjalan [[ -n ... ]]. Dalam hal ini, ia menguji apakah output yang ditangkap tidak kosong. Tetapi jika Anda mengarahkan semuanya ke /dev/null, hasilnya memang kosong!

Anda tidak perlu menangkap hasilnya. which seharusnya sudah mengembalikan status bukan nol ketika tidak dapat menemukan file untuk dieksekusi.

which pacman &> /dev/null && echo pacman
3
choroba 12 Mei 2021, 15:49