Làm cách nào tôi có thể theo dõi tập lệnh cung cấp cho tôi lệnh không được tìm thấy ngay sau khi đăng nhập?


8

Khi tôi đăng nhập, tôi có những thông báo sau:

-bash: $'\r' : command not found
-bash: $'\r' : command not found
-bash: $'\r' : command not found 

Một điều khá rõ ràng là nguyên nhân của các kết thúc dòng kiểu Windows trong một số tập lệnh khởi động, vì vậy câu hỏi của tôi là: Tôi có thể theo dõi tập lệnh gây ra điều đó không và bằng cách nào?


2
Hãy thử xem các tệp .bashrc, .bash_profile và hồ sơ trong thư mục chính của bạn cũng như / etc / profile
Raman sailopal 15/03/19

Câu trả lời:


14

Bash đọc một số tệp khác nhau khi khởi động, thậm chí tùy thuộc vào cách nó bắt đầu ( xem hướng dẫn để biết mô tả ). Sau đó, có những thứ như thế /etc/profile.d/không được đọc trực tiếp bởi trình bao, nhưng có thể được tham chiếu từ các tệp khởi động khác trong nhiều bản phân phối.

Bạn sẽ phải trải qua tất cả những điều đó nhưng may mắn thay, bạn chỉ có thể grepquay trở lại xe ngựa. Hãy thử ví dụ như:

grep $'\r' ~/.bashrc ~/.profile ~/.bash_login ~/.bash_profile /etc/bash.bashrc /etc/profile /etc/profile.d/*

Xem thêm Có thể tìm ra tệp nào đang được đặt / thêm vào các biến môi trường và thứ tự ưu tiên của chúng không? cho một vấn đề tương tự


6
Thêm một nơi để tìm kiếm:~/.bash_aliases
Weijun Zhou

1
Một lựa chọn khác là sử dụng strace -e open your-shell, từ câu trả lời của Stéphane tại đây
Jeff Schaller

5

tập tin (1) cũng có thể hữu ích ở đây.

$file *

signin:                                     Python script, ASCII text
signup:                                     Python script, ASCII text, with CRLF line terminators
site_off.htm:                               XML 1.0 document, ASCII text
sitemaps:                                   directory

Tôi có thể thấy rằng signupcần phải loại bỏ các kết thúc dòng Windows CRLF phiền phức đó.

Đối với một đệ quy trực tiếp như /home/usernamebạn có thể có thể kết hợp với findxargs(và có thể cả một grep nữa):

$ find . | xargs file | grep CR

./foo_data/V: ASCII text, with CR, LF line terminators
./foo_data/Y: ASCII text, with CR, LF line terminators

3

Một phương pháp khác là lấy tất cả các tập lệnh khởi động được đề cập và lặp lại một chuỗi xác định từng tập lệnh ở đầu mỗi tập lệnh.

$ head .bashrc
echo "Running bashrc"

Sau đó, khi đăng nhập, bạn sẽ thấy một cái gì đó như thế này:

running bashrc
running bash_aliases
-bash: $'\r' : command not found
-bash: $'\r' : command not found
-bash: $'\r' : command not found 
running something_else

Tại thời điểm đó, bạn có thể kết luận rằng, (trong ví dụ trên) .bash_aliasescó chứa các kết thúc dòng vi phạm.

Khi bạn đã xác định được tệp, nhưng các dòng vấn đề không nhảy ra khỏi bạn, bạn có thể sử dụng cùng một phương pháp để theo dõi dòng. Gửi lại tin nhắn giữa chừng tệp, sau đó 3/4 hoặc 1/4 giây, tùy thuộc vào đầu ra. Bằng cách đó bạn có thể theo dõi dòng, tùy thuộc vào việc nó lặp lại trước hay sau tiếng vang của bạn.


Vâng, phương pháp này là tốt nếu người ta có thể nhanh chóng tự động hóa nó, nếu không thì nó gần giống như xem qua tất cả các tệp này.
Denis Sablukov

1
Lưu ý rằng bạn cũng có thể muốn nói 'đã chạy xong <file>' ở cuối mỗi tệp. Trong trường hợp này, điều đó không thực sự quan trọng trừ khi chỉ một số dòng có kết thúc dòng CR, nhưng nếu bạn đang tìm kiếm một lỗi khác thì nó có thể nằm trong .bashrc của bạn sau khi bạn nhập .bash_aliases.
Ben Millwood

1
Đối với ai đó chỉ học cách gỡ lỗi các vấn đề về vỏ hoặc khi không dễ dàng như tìm kiếm '\ r', câu trả lời NÀY có giá trị trong hộp công cụ kiến ​​thức của bạn. Tôi đã thừa hưởng một hệ thống xây dựng phức tạp, đó là một tập hợp các tập lệnh được đính kèm để thực hiện các bản dựng từ xa qua SSH. Đây là cách duy nhất để thư giãn nó và di chuyển nó đến các container Docker.
Scott Prive

1
Một mẹo chung khác - khi xử lý các tập lệnh Bash liên quan đến nhau, hãy chú ý đến nơi bạn thêm các câu lệnh echo và (dù bạn đang làm gì) thường xuyên kiểm tra. Nếu một tập lệnh bash được sử dụng để xuất các chuỗi thành STDOUT và bạn đã thêm các câu lệnh gỡ lỗi vào STDOUT thì có lẽ bạn đã phá vỡ điều bạn đang gỡ lỗi. Đôi khi, câu trả lời là sử dụng lệnh "logger" để thêm thông tin / gỡ lỗi vào tập lệnh. Những lần khác sử dụng STDERR, nếu đó là một điều kiện cảnh báo.
Scott Prive

@DenisSablukov nếu các tệp của bạn dài và việc xem qua chúng mất một lúc, phương pháp này sẽ giúp bạn thu hẹp nguồn nhanh hơn. Sẽ không mất nhiều thời gian để ở một dòng trên cùng và dưới cùng của 6 tệp.
dùng394 16/03/19

3

Tôi coi phần khó của câu hỏi này là "làm thế nào tôi có thể tìm thấy vận chuyển trở lại trong một tập tin?" nhưng "làm thế nào tôi có thể tìm ra tập tin nào mà bashrc của tôi sử dụng?"

Đối với câu hỏi thứ hai, bạn có thể thử một cái gì đó như thế này:

bash -x .bashrc

Điều này sẽ cho bạn thấy mọi thứ mà bashrc của bạn làm, bao gồm tất cả các tệp mà nó đề cập đến. Nó không gây ồn ào, nhưng sẽ giúp bạn theo dõi những tập tin nào đang được sử dụng.

Thực tế, ngoại trừ, các .bashrctệp của tôi (và nhiều tệp khác) thoát sớm nếu không chạy tương tác, vì vậy bạn phải lừa nó để vượt qua kiểm tra đó:

bash -ix .bashrc

Ở đây các -ilực lượng chế độ tương tác.

Để tìm ra những trường hợp bạn lấy một tập tin, một cái gì đó như thế này có hiệu quả với tôi nhưng tôi không thể hứa rằng regex sẽ nắm bắt mọi thứ:

bash -ix .bashrc 2> >(grep -E '^\+* (\.|source)')

Tôi đoán bạn cũng có thể muốn các thông báo lỗi, vì vậy một cái gì đó như:

bash -ix .bashrc 2> >(grep -E -e '^\+* (\.|source)' -e 'command not found')

Nếu vì một lý do nào đó, không cái nào trong số này hoạt động, tôi sẽ dùng đến strace -e open bashcái gì đó tương tự, để tìm mỗi khi bất kỳ tệp nào được mở bởi phiên bash của bạn. Nhưng đó là một giải pháp thậm chí nặng hơn / ồn à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.