2012-08-16 20 views
7

Tôi đang cố gắng lặp lại dòng sau đây thành một .profile nhưng nó liên tục bị nhầm lẫn bởi nhiều dấu ngoặc kép hoặc ký tự đặc biệt.Cách lặp dòng với nhiều dấu ngoặc kép/ký tự đặc biệt vào trong tệp?

bind '"e[A": history-search-backward'

Tôi đã thử tất cả các loại vật nhưng không thể làm cho nó bị đóng đinh.

Đây là những gì tôi hiện có:

sudo su -c 'echo "bind \'\"\\e[A\": history-search-backward\'" >> /etc/profile' -

Đây là những gì nó sẽ trả về:

su: user '"\e[A": does not exist

Tuy nhiên, nếu tôi chỉ sử dụng:

echo bind \'\"\\e[A\": history-search-backward\'" >> /home/user/testfile

Nó hoạt động tốt.

Tôi có tất cả các cách thức của "sudo su -c "echo blah ..." trong phần còn lại của kịch bản của tôi mà chỉ làm việc tốt.

Bất kỳ ý tưởng?

+0

'\ '\" \\ e [A \ "' Có thêm \ trước e. – steveg89

+0

Anh ta cần hai dấu gạch chéo ngược sao cho chữ \ được thêm vào/etc/profile. – chepner

Trả lời

5

Hãy thử điều này

sudo su -c $'echo \"bind \'\"\\e[A\": history-search-backward\'\" >> /etc/profile\' -' 

Từ trang bash người đàn ông:.

một câu nói duy nhất có thể không xảy ra giữa dấu nháy đơn, ngay cả khi trước bởi một dấu chéo ngược

Văn bản được trích dẫn bởi $'...' có thể chứa dấu ngoặc kép dấu gạch chéo ngược, cả đơn và đôi.

Một lựa chọn khác là thêm một biểu thức đơn giản để ~/.inputrc:

echo '"\e[A": history-search-backward' >> ~/.inputrc 

Có vẻ như không phải là một tương đương trên toàn hệ thống của .inputrc được đọc bởi tất cả người dùng. Ngoài ra, điều này làm cho các ràng buộc quan trọng có sẵn cho bất kỳ chương trình sử dụng readline. Nếu bạn thực sự muốn hạn chế nó để bash, thêm một biểu thức điều kiện:

cat >> ~/.inputrc <<'EOF' 
$if Bash 
"\e[A": history-search-backward 
$endif 
EOF 
0

Mỗi nhân vật được hiểu theo nghĩa đen giữa dấu nháy đơn, trừ ' riêng của mình. Vì vậy, bạn có thể đặt một trích dẫn duy nhất bên trong một chuỗi chữ như sau: 'single'\''quoted' là chuỗi single'quoted.

Lệnh của bạn phức tạp vì có hai shell liên quan: shell bạn đang chạy lệnh này và shell chạy su. Lưu ý rằng thật lạ khi chạy sudo susudo đã chạy lệnh được chỉ định làm gốc; sudo sh -c … có ý nghĩa hơn. Vì vậy, bạn cần báo giá cho cả hai. Nó thường là rõ ràng nhất để sử dụng dấu ngoặc đơn cho vỏ bên ngoài, và dấu ngoặc kép hoặc dấu nháy đơn hoặc dấu gạch chéo ngược cho vỏ bên trong.

Có một vấn đề khác với lệnh của bạn: bạn đang nhắm mục tiêu sai tệp./etc/profile chỉ được đọc bởi vỏ đăng nhập, trong khi lệnh bind là đặc thù để bash nhưng phải được đọc bởi tất cả các trường hợp bash, không chỉ vỏ đăng nhập. Thay vì viết dòng này vào /etc/profile, bạn nên viết nó vào toàn hệ thống bashrc, nếu có (thường là /etc/bash.bashrc).

sudo sh -c 'echo "bind '\''\"\\e[A\": history-search-backward'\''" >>/etc/bash.bashrc' 

Bạn có thể đặt cài đặt này trực tiếp vào tệp cấu hình readline, /etc/inputrc. Bạn sẽ tiết kiệm được một mức trích dẫn.

sudo sh -c 'echo '\''"\e[A": history-search-backward'\'' >>/etc/inputrc' 

Một cách dễ dàng hơn để vượt qua một chuỗi tùy ý để một lệnh sẽ được vượt qua nó như là đầu vào thay vì như một tham số và sử dụng một here document.

sudo sh -c 'cat >>/etc/inputrc' <<'EOF' 
"\e[A": history-search-backward 
EOF 
Các vấn đề liên quan