Tại sao nguồn cung cấp một lỗi mà không thể thực hiện được tệp nhị phân


10

Tôi có một tệp nhỏ khởi tạo một tmuxphiên và sau đó tạo một số cửa sổ. Sau khi một số gỡ lỗi và tinh chỉnh mọi thứ hoạt động tốt cho đến khi tôi đổi tên tệp văn bản (với các tmuxlệnh) từ spamthành xset:

$ source xset
bash: source: /usr/bin/xset: cannot execute binary file

Bây giờ tôi đã đổi tên tập tin trở lại và source spamhoạt động trở lại, nhưng tôi tự hỏi tại sao điều này là. Các tập tin trong thư mục nhà của tôi, và không trong /usr/bin.


Có một nhị phân gọi là xset. Hãy thử source ./xset.
Faheem Mitha

Câu trả lời:


11

các bashnguồn lệnh nội bộ, đầu tiên sẽ tìm kiếm tên tập tin trong PATH, trừ khi có một dấu gạch chéo ( /) trong tên tập tin. xsetlà một tập tin thực thi trong PATH của bạn, do đó có vấn đề.

Bạn có thể thực thi source ./xsethoặc thay đổi tùy chọn đường dẫn thành tắt bằng:

shopt -u sourcepath

Từ trang bashcon người:

      source filename [arguments]
          Read and execute commands from filename  in  the  current  shell
          environment  and return the exit status of the last command exe
          cuted from filename.  If filename does not contain a slash, file
          names  in  PATH  are used to find the directory containing file
          name.  The file searched for in PATH  need  not  be  executable.
          When  bash  is  not  in  posix  mode,  the  current directory is
          searched if no file is found in PATH.  If the sourcepath  option
          to  the  shopt  builtin  command  is turned off, the PATH is not
          searched.  If any arguments are supplied, they become the  posi
          tional  parameters  when  filename  is  executed.  Otherwise the
          positional parameters are unchanged.  The return status  is  the
          status  of  the  last  command exited within the script (0 if no
          commands are executed), and false if filename is  not  found  or
          cannot be read.

5

Các sourcelệnh sẽ :

Đọc và thực thi các lệnh từ đối số tên tệp trong ngữ cảnh shell hiện tại. Nếu tên tệp không chứa dấu gạch chéo, PATHbiến được sử dụng để tìm tên tệp .

Hành vi này được xác định (cho ., bí danh của nó) bởi POSIX . Tại sao? Chà, bạn có thể đặt các tập lệnh cấu hình có thể tìm được bên trong PATHvà truy cập chúng mà không cần đường dẫn đủ điều kiện. Để truy cập tệp bạn muốn, thay vào đó hãy đưa ra một đường dẫn tuyệt đối hoặc tương đối:

source ./xset
source ~/xset
source /home/shawn/xset

Tất cả những điều trên sẽ làm việc như bạn mong đợi ban đầu. Bạn cũng có thể vô hiệu hóa sourcepathvới shopt.

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.