Làm thế nào để tạo `local` chụp mã thoát?


11

Trong dự án của tôi, tôi có đoạn trích sau:

local output="$(bash "${1##*/}")"
echo "$?"

Điều này luôn luôn in số 0 local, tuy nhiên, loại bỏ locallàm cho $?biến hoạt động chính xác: đó là giả sử mã thoát khỏi lớp con.

Câu hỏi của tôi là: làm thế nào tôi có thể giữ biến này cục bộ trong khi cũng nắm bắt được giá trị thoát?


1
shellchecksẽ không chỉ nắm bắt được vấn đề này mà còn đề xuất giải pháp tại unix.stackexchange.com/a/281749/24718 !
Waleed Khan

Câu trả lời:


16
#!/bin/bash
thing() {
   local foo=$(asjkdh) ret="$?"
   echo "$ret"
}

Điều này sẽ lặp lại 127, mã lỗi chính xác cho "không tìm thấy lệnh".

Bạn có thể sử dụng localđể xác định nhiều hơn một biến. Vì vậy, tôi cũng chỉ tạo biến cục bộ RETđể nắm bắt mã thoát của lớp con trước khi localthành công và đặt $?thành không.


Có đảm bảo rằng bashđánh giá biểu thức này từ trái sang phải?
Tối đa

Theo như tôi biết, các bài tập biến đổi theo thứ tự, từ trái sang phải trong bối cảnh này, vâng.
DopeGhoti

@MaxRied thực tế công việc này đáng tin cậy sẽ xuất hiện để chỉ ra rằng có, nó là. Tuy nhiên, tôi không thể tìm thấy thông tin nào về điều này cả từ bashtài liệu tham khảo của POSIX cũng như .
con mèo

10
Như một bên, sử dụng tên biến all-caps là hình thức xấu. Xem thông số kỹ thuật biến môi trường POSIX tại pubs.opengroup.org/onlinepub/009695399/basingefs/ tựa , mô tả các tên viết hoa là dành riêng cho các biến có ý nghĩa với vỏ hoặc hệ thống và tên có ít nhất một ký tự chữ thường Dành riêng cho sử dụng do ứng dụng xác định, lưu ý rằng các biến shell và biến môi trường chia sẻ một không gian tên (vì trong trường hợp va chạm, gán cho cái trước có thể ghi đè lên cái sau).
Charles Duffy

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
terdon

27

Khai báo biến cục bộ trước khi bạn gán cho nó:

thing() {
  local output
  output="$(bash "${1##*/}")"
  echo "$?"
}

Theo tôi điều này cũng dễ đọc hơn là đặt một RETbiến bổ sung . YMMV về điều đó, nhưng nó hoạt động như bạn mong đợi.


2
Đây là nhiều hơn so với sử dụng một biến riêng biệt, như nên được rõ ràng nếu bạn muốn kiểm tra mã trở lại của nhiều tập: đơn giản local var1 var2 ...và Bob là chú của bạn.
l0b0

@ l0b0 Bob chú tôi. : D
con mèo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.