IFS null không giống với IFS chưa đặt?


13

Tôi đã đọc một câu hỏi lớn ở đây được gọi là Hiểu IFS . Tôi đã rất ngạc nhiên vì các câu trả lời và bình luận trích dẫn POSIX nói rằng IFS = không giống với việc không đặt IFS. Nếu bạn bỏ đặt IFS, rõ ràng giá trị mặc định được sử dụng. Nếu bạn tạo IFS null thay vào đó, không có bộ chia. Tôi biết rằng tôi đã thấy một sự khác biệt về điều đó và tôi đã tìm thấy điều này trong dấu trang của mình:

Lập trình vỏ Bourne

$ IFS

Câu lệnh đầu tiên trong kịch bản của bạn phải là

IFS =

trong đó đặt lại dấu phân cách trường đầu vào về giá trị mặc định của nó. Mặt khác, bạn thừa hưởng $ IFS từ người dùng, người có thể đã đặt nó thành một giá trị kỳ quái nào đó để tạo chuỗi phân tích sh khác với cách bạn mong đợi và gây ra hành vi kỳ lạ.

Vì vậy, điều đó có đúng trong một thời gian trước đây hay tác giả chỉ sai?

Câu trả lời:


20

Các câu trả lời bạn tìm thấy trên Stack Exchange là đúng và hướng dẫn này sai. Bạn có thể tự thử nghiệm hoặc tìm kiếm nó trong tiêu chuẩn . Một unset IFStương đương với việc đặt nó thành giá trị mặc định của không gian-tab-newline, trong khi một cách trống IFScó hiệu quả tắt tách trường.

Bạn có thể tham khảo trang của Sven Mascheck trên IFS về các triển khai lịch sử. Một vài shell lịch sử không thích unset IFS, và một phiên bản ksh rất cũ đã coi nó như một IFSvỏ rỗng nhưng tất cả các shell hiện đại và hầu hết các shell cũ đều coi một unset IFSnhư giá trị mặc định.

Bạn không nên bắt đầu tập lệnh của mình IFS=trừ khi bạn muốn tắt phân tách trường (đó có thể là một quyết định hợp lý - nhưng lưu ý rằng bạn vẫn cần đặt dấu ngoặc kép xung quanh các thay thế để tránh bị chặn, trừ khi bạn cũng tắt nó đi set -f). Để đặt lại giá trị mặc định, sử dụng unset IFS. Người ta tranh cãi liệu điều này có hữu ích khi bắt đầu một kịch bản hay không; có rất nhiều điều tồi tệ khác như sự tinh ranh PATHmà người gọi có thể làm để làm cho kịch bản của bạn bị sai.

Hướng dẫn này cũng khuyên nên thiết lập lại PATH. Đây thường là lời khuyên tồi. Trong hầu hết các trường hợp, bạn không thể dự đoán đường dẫn tìm kiếm chính xác là gì, nhưng người dùng biết. Làm thế nào để bạn biết liệu có /usr/local/binhoặc /home/bob/binchứa các phiên bản tiện ích cố định lỗi trên một unix cổ mà các /usr/binlỗi trong đó là lỗi không? Bạn có thực sự muốn nhúng tất cả logic để tìm hiểu xem có nên đi /usr/xpg6/bintrước /binkhông? Ở vị trí nào bạn muốn /usr/gnu/bin? Không đặt lại PATH trừ khi tập lệnh của bạn nhắm vào một hệ thống cụ thể.

Tôi chưa đọc hướng dẫn này, nhưng tôi đã kiểm tra một điều: nó không cho bạn biết ngay từ đầu để luôn đặt dấu ngoặc kép xung quanh các thay thế thay thế và thay thế lệnh. Vì vậy, tôi không nghĩ rằng hướng dẫn này là một hướng dẫn tốt.


unset IFSkhông đặt lại IFS về giá trị mặc định của nó trong bash mặc dù nó đặt lại phân tách trường.
Melab

@Melab unset IFSkhông thiết lập lại IFSgiá trị mặc định của nó, nó bỏ cài đặt nó. Nhưng một unset IFScó tác dụng tương tự như IFSđược đặt thành giá trị mặc định.
Gilles 'SO- ngừng trở nên xấu xa'
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.