a

Câu hỏi '\ r': không tìm thấy lệnh - .bashrc / .bash_profile


Tôi có cửa sổ, sử dụng Cygwin, cố gắng thiết lập JAVA_HOME vĩnh viễn thông qua .bashrc tập tin.

.bashrc:

export PATH="$JAVA_HOME/bin:$PATH"  
export JAVA_HOME=$JAVA_HOME:"/cygdrive/c/Program Files (x86)/Java/jdk1.7.0_05"

.bash_profile:

if [ -f ~/.bashrc ]; then
   source ~/.bashrc
fi

chạy Cygwin:

-bash: $'\377\376if': command not found
-bash: $'then\r': command not found
: No such file or directorysu//.bashrc
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: syntax error near unexpected token `fi'
-bash: /cygdrive/c/Users/jhsu//.bash_profile: line 3: `fi'

Tôi không chắc chắn nếu tôi đã lấy các lệnh từ một hướng dẫn có nghĩa là cho một hệ thống khác hoặc nếu tôi thiếu một bước. Hoặc khoảng trống đang khiến các lệnh của tôi không chạy đúng cách.

Tôi đã xem xét nhiều câu hỏi tương tự nhưng tôi chưa tìm thấy câu hỏi nào có lỗi chính xác.


Đường dẫn nhà của tôi:

$ echo $HOME
/cygdrive/c/Users/jhsu
$ echo ~
/cygdrive/c/Users/jhsu/

Vì vậy, tôi tin rằng các tập tin nên được đặt ở vị trí chính xác.


186
2017-07-23 16:45


gốc


Cái gì echo ~ đưa cho? - harpo
$ echo ~ / cygdrive / c / Người dùng / jhsu / - Jasmine
có thể trùng lặp chạy bash script trong cygwin trên windows 7 - Qix
Vấn đề không dành riêng cho cygwin - cùng một vấn đề có thể xảy ra nếu tạo một kịch bản trên máy DOS và thực hiện chuyển giao nhị phân sang hệ thống Linux và chạy nó ở đó; Tôi đã loại bỏ các tham chiếu Cygwin từ tiêu đề để những người có vấn đề này trong các trường hợp khác sẽ có nhiều khả năng đưa câu hỏi (và các câu trả lời không phải Cygwin cụ thể của nó) nghiêm túc. - Charles Duffy
Đối với nền tảng về vấn đề này đặc biệt trong bối cảnh của Cygwin, nó xuất hiện rằng khoảng năm 2007 là khi Cygwin bắt đầu xử lý trả về vận chuyển theo kiểu Unix - xem neuron.yale.edu/phpBB/viewtopic.php?t=878. Bài đăng trên diễn đàn đó giải thích tùy chọn trình bao bỏ qua được thảo luận trong một số câu trả lời bên dưới. - Evan Donovan


Các câu trả lời:


Khi mọi thứ khác thất bại trong Cygwin ...

Hãy thử chạy dos2unix lệnh trên tệp được đề cập.

Nó có thể hữu ích khi bạn thấy các thông báo lỗi như thế này:

-bash: '\r': command not found

Các ký tự dòng mới của Windows có thể gây ra sự cố trong Cygwin.

Các dos2unix lệnh sửa đổi các ký tự dòng mới để chúng tương thích với Unix / Cygwin.

THẬN TRỌNG: lệnh dos2unix sửa đổi tệp tại chỗ, vì vậy hãy thận trọng nếu cần.

Nếu bạn cần giữ lại tập tin gốc, bạn nên sao lưu nó trước.

Lưu ý cho người dùng Mac: Các dos2unix lệnh không tồn tại trên Mac OS X.

Kiểm tra câu trả lời này cho nhiều giải pháp sử dụng các công cụ khác nhau.


Cũng có một unix2dos lệnh mà ngược lại:

Nó sửa đổi các ký tự dòng mới của Unix để chúng tương thích với các công cụ Windows.

Nếu bạn mở một tệp bằng Notepad và tất cả các dòng chạy cùng nhau, hãy thử unix2dos filename.


252
2017-10-02 17:42



Đẹp, dos2unix cố định nó, cảm ơn. Tôi cũng đã thêm JAVA="$JAVA_HOME"/bin/java và bây giờ nó tìm thấy Java của tôi! - Jasmine
Cẩn thận với dos2unix; không giống như hầu hết các bộ lọc văn bản, nó sẽ ghi đè tệp đầu vào của nó theo mặc định. - Keith Thompson
dos2unix khiến tôi tỉnh táo. - Dreen
rõ ràng với tôi rằng các cửa sổ dòng mới đang gây ra rắc rối này, nhưng câu hỏi của tôi là, tôi có thể chế tạo cygwin chấp nhận dòng mới này (các cửa sổ) quá? Tôi đang bối rối vì tôi git-nhân bản một repo trong Cygwin chứa các tệp .sh nhưng chúng đi kèm với \ r \ n end ... rõ ràng hoặc là git dịch các dòng mới ngay cả khi tôi chạy nó từ bên trong Cygwin, hoặc Repo không có vấn đề với bash shell script .sh tệp với cửa sổ newlines (hoặc không ai biết / quan tâm rằng repo chứa các tập tin xấu mà không chắc). Tôi biết git có thể làm chuyển đổi dòng mới nhưng tôi sẽ không mong đợi nó trên Cygwin. - n611x007
@naxa - Các dòng mới có lẽ đã được chọn dựa trên hệ điều hành: Cygwin = Windows - jahroy


Đối với những người không có dos2unix cài đặt (và không muốn cài đặt nó):

Xóa dấu \r ký tự gây ra lỗi này:

sed -i 's/\r$//' filename


Giải trình:

Tùy chọn -i là cho tại chỗ chỉnh sửa, chúng tôi xóa dấu \r trực tiếp trong tệp đầu vào. Do đó hãy cẩn thận để nhập đúng mẫu.


123
2018-06-11 12:08



Cảm ơn rất nhiều, giải pháp này làm việc cho tôi và tôi cũng cảm thấy đó là giải pháp dễ dàng nhất - Smruti R Tripathy
đây phải là câu trả lời được chấp nhận và trả lời nhiều nhất. săn bắn cho một số comm2 dos2unix không phải là lựa chọn tốt nhất ... - Mzn
Tôi đã luôn luôn sử dụng giải pháp này trên Cygwin của tôi. Hoạt động tuyệt vời! - Binita Bharati
Làm thế nào để làm điều này trên một thư mục toàn bộ với các tập tin? - Highmastdon
để thực hiện việc này cho tất cả các tệp trong thư mục hiện tại chạy <br/> for i in *;do if [[ -f $i ]]; then sed -i 's/\r$//' "$i"; fi; done - Sasha Bond


Tôi đang sử dụng Cygwin và Windows7, thủ thuật KHÔNG được đặt set -o igncr vào .bashrc của bạn nhưng đặt toàn bộ SHELLOPTS vào các biến môi trường của bạn trong Windows. (Vì vậy, không có gì với unix / cygwin ...) Tôi nghĩ rằng nó không hoạt động .bashrc bởi vì "giọt đã bị hút" như chúng ta sẽ nói bằng tiếng Đức. ;-) Vì vậy, tôi SHELLOPTS trông như thế này

braceexpand:emacs:hashall:histexpand:history:igncr:interactive-comments:monitor

33
2017-07-28 11:02



Lý do SHELLOPTS cần được đặt trong các cửa sổ biến môi trường thay vì Cygwin biến môi trường là vì biến đó chỉ được đọc bởi bash (theo "bash"). Vì vậy, nó phải được thiết lập trước khi shell của bạn bắt đầu - do đó nó phải đi vào một biến môi trường Windows. - svec
Tôi muốn chỉ làm rõ câu trả lời cho người dùng thử và lỗi có thể hiểu sai: chỉ igncr thực sự cần thiết trong SHELLOPTS. - Martin D


Nếu bạn đang sử dụng Cygwin gần đây (ví dụ: 1.7), bạn cũng có thể bắt đầu cả hai .bashrc và .bash_profile với dòng sau, trên dòng không bình luận đầu tiên:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
(set -o igncr) 2>/dev/null && set -o igncr; # this comment is needed

Điều này sẽ buộc bash để bỏ qua trở lại vận chuyển (\r) ký tự được sử dụng trong bộ tách dòng Windows.

Xem http://cygwin.com/ml/cygwin-announce/2010-08/msg00015.html.


25
2017-10-06 15:15



đây là những gì tôi đang tìm kiếm nhưng nó đã không làm việc cho tôi .. nên điều này vẫn còn làm việc bây giờ, một năm latr? - n611x007
chỉnh sửa: export SHELLOPTS đã làm các trick cho tôi! nhưng đôi khi tôi vẫn có "tên tùy chọn không hợp lệ" - tại sao vậy? - n611x007
từ đây: stackoverflow.com/a/14607651/611007 - n611x007
Nhưng để làm việc, bạn cần đặt nó ở đầu tất cả các tập lệnh của bạn, không chỉ là .bashrc và .bash_profile. - Ael Ombreglace
Sử dụng SHELLOPTS xuất khẩu có thể sẽ giúp bạn có được một "tên tùy chọn không hợp lệ" khi bạn gọi / bin / sh (một số lệnh như awk làm ngầm) trong bash shell của bạn. sh hiểu SHELLOPTS, nhưng không hiểu rõ ràng. - Ael Ombreglace


Dành cho CÁC CỬA SỔ người dùng có Notepad ++ (được kiểm tra với v6.8.3) bạn có thể sửa tập tin cụ thể bằng cách sử dụng tùy chọn - Chỉnh sửa -> Chuyển đổi EOL -> Định dạng Unix / OSX

Và lưu lại tệp của bạn.

Chỉnh sửa: vẫn hoạt động trong v7.5.1 (ngày 29 tháng 8 năm 2017)


23
2018-03-18 13:39





Bạn cũng có thể thêm tùy chọn -o igncr cho cuộc gọi bash, ví dụ:

bash -x -o igncr script.sh

17
2017-09-29 13:36





SUBLIME TEXT

Với tuyệt vời bạn chỉ cần đi đến

Xem -> Kết thúc dòng -> (chọn) Unix

Sau đó lưu tệp. Sẽ khắc phục sự cố này.

Dễ dàng như vậy!


17
2018-03-08 16:24



cảm ơn, tôi đang sử dụng các tệp WSL tuyệt vời và hoàn toàn quên mất điều này - Alexis
Để làm cho nó vĩnh viễn, Preferences -> Settings, "default_line_endings": "unix" - smac89


Lỗi:

'\r': lệnh không tìm thấy

là do shell không thể nhận ra các kết thúc dòng CRLF giống như Windows (0d 0a) vì nó chỉ mong đợi LF (0a).


Git

Nếu bạn sử dụng Git trên Windows, hãy đảm bảo bạn đã chọn 'Thanh toán dưới dạng'trong khi thiết lập. Sau đó, hãy chắc chắn rằng bạn chạy: git config --global core.autocrlf false, vì vậy Git sẽ không thực hiện bất kỳ chuyển đổi nào khi kiểm tra hoặc cam kết tệp văn bản.


dos2unix

Nếu bạn không sử dụng Git, bạn chỉ cần chuyển đổi các tệp / tập lệnh bị ảnh hưởng này trở lại thành phần cuối dòng Unix (LF), hoặc bằng cách:

dos2unix ~/.bashrc

Lưu ý: The dos2unix lệnh là một phần của dos2unix gói.

Trình chỉnh sửa Ex / Vim + tr

Nếu bạn đã cài đặt Vim, lệnh sau sẽ sửa các tệp:

ex +'bufdo! %! tr -d \\r' -scxa ~/.bash*

Bí danh hữu ích: alias dos2unix="ex +'bufdo! %! tr -d \\\\r' -scxa".

tr

Đây là phương pháp bằng cách sử dụng tr:

cat ~/.bashrc | tr -d '\r' > ~/.bashrc.fixed && mv -v ~/.bashrc.fixed ~/.bashrc

hoặc là:

tr -d '\r' < filename > new_filename

Lưu ý: The \r tương đương với \015.


sed

Bạn có thể thử lệnh sau:

sed -i'.bak' s/\r//g ~/.bash*

recode

Các bí danh sau có thể hữu ích (thay thế dos2unix chỉ huy):

alias unix2dos='recode lat1:ibmpc'
alias dos2unix='recode ibmpc:lat1'

Nguồn: Công cụ Unix miễn phí (ssh, bash, v.v.) trong Windows.


perl

Sau đây perl lệnh có thể chuyển đổi tập tin từ DOS sang định dạng Unix:

perl -p -i.bak -e 's/\015//g' ~/.bash*

Nguồn: tước ^ M.


tofrodos

Trên Linux, giống như Ubuntu không đạt tiêu chuẩn dos2unix hoặc là unix2dos, bạn có thể cài đặt tofrodos gói (sudo apt-get install tofrodos) và xác định các bí danh sau:

alias dos2unix=’fromdos’
alias unix2dos=’todos’

Sau đó sử dụng trong cùng một cú pháp như trên.


Vagrant

Nếu bạn đang sử dụng máy ảo Vagrant và điều này xảy ra cho việc cung cấp tập lệnh, hãy thử cài đặt binary tùy chọn để true:

# Shell provisioner, see: https://www.vagrantup.com/docs/provisioning/shell.html
config.vm.provision "shell" do |s|
  s.binary = true # Replace Windows line endings with Unix line endings.
  s.path = "script.sh"
end

Xem: Windows CRLF cho các vấn đề Unix LF trong Vagrant.


9
2017-11-30 02:59





những người sử dụng notepad ++ (6.8.1) để gửi các kịch bản shell từ cửa sổ lên linux.

thiết lập những điều sau đây trong notepad ++ Chỉnh sửa -> Chuyển đổi EOL -> Định dạng Unix / OSX


3
2018-06-02 23:22





Theo điều này ý chính, giải pháp là tạo ra ~/.bash_profile (trong HOME ) chứa:

export SHELLOPTS
set -o igncr

3
2018-02-24 09:08