Perhatikan bahwa hal ini tidak berlaku jika digabungkan dengan local
, seperti pada local variable="$(command)"
. Formulir itu akan berhasil keluar meskipun command
gagal.
Ambil skrip Bash ini misalnya:
#!/bin/bash
function funWithLocalAndAssignmentTogether() {
local output="$(echo "Doing some stuff.";exit 1)"
local exitCode=$?
echo "output: $output"
echo "exitCode: $exitCode"
}
function funWithLocalAndAssignmentSeparate() {
local output
output="$(echo "Doing some stuff.";exit 1)"
local exitCode=$?
echo "output: $output"
echo "exitCode: $exitCode"
}
funWithLocalAndAssignmentTogether
funWithLocalAndAssignmentSeparate
Inilah hasilnya:
[email protected]:~$ ./tmp.sh
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1
Ini karena local
sebenarnya adalah perintah bawaan, dan perintah seperti local variable="$(command)"
memanggil local
setelah mengganti output dari command
. Jadi Anda mendapatkan status keluar dari local
.
Setelah menjalankan perintah sebagai $(command)
memungkinkan output dari perintah untuk menggantikan dirinya sendiri.
Saat Anda mengatakan:
a=$(false) # false fails; the output of false is stored in the variable a
output yang dihasilkan oleh perintah false
disimpan dalam variabel a
. Apalagi kode keluarnya sama dengan yang dihasilkan oleh perintah. help false
akan memberi tahu:
false: false
Return an unsuccessful result.
Exit Status:
Always fails.
Di sisi lain, mengatakan:
$ false # Exit code: 1
$ a="" # Exit code: 0
$ echo $? # Prints 0
menyebabkan kode keluar untuk penetapan ke a
dikembalikan yaitu 0
.
EDIT:
Mengutip dari manual:
Jika salah satu perluasan berisi substitusi perintah, status keluar dari perintah adalah status keluar dari substitusi perintah yang terakhir dilakukan.
Mengutip dari BASHFAQ/002:
Bagaimana cara menyimpan nilai kembalian dan/atau output dari perintah dalam variabel?
...
output=$(command)
status=$?
Penugasan ke
output
tidak berpengaruh padacommand
status keluar, yang masih dalam$?
.