Báo giá


15

Việc sử dụng lệnh là quotegì? Tôi không tìm thấy bất kỳ thông tin nào về nó, nó không nằm trong số các tệp thực thi trong /bincác thư mục và không thể tìm thấy nó trong các tệp dựng sẵn của Bash. Có vẻ như nó chỉ in tham số đầu tiên của nó, giống như một echolệnh và không có gì nữa.


nó chỉ thêm các trích dẫn
Hakeem Wahab

1
Chỉ cần chọc ngoáy, tôi tìm thấy một tiện ích có tên shell-quote tương tự như quote, nhưng có một số cách sử dụng với những thứ như ssh và để gỡ lỗi các tập lệnh bash. Tôi nghĩ tôi sẽ đưa nó vào đây như một chú thích. ' linux.die.net/man/1/shell-quote '
Joe

Cảm thấy như một WTF có một từ phổ biến như vậy quote, được sử dụng cho mục đích tối nghĩa đó ... Không có tiền tố để đánh dấu nó là "nội bộ", không có tài liệu, không có gì, trừ khi bạn đi sâu vào chi tiết triển khai các cơ chế hoàn thành nâng cao của bản phân phối. Tôi thấy điều này một chút đáng lo ngại.
hyde

Nó càng trở nên mơ hồ hơn đối với người mà ngôn ngữ mẹ đẻ không phải là tiếng Anh. Như tôi chẳng hạn. :)
whtyger

Câu trả lời:


10

Nó là gì?

Tôi nhận thấy rằng lệnh này không hoạt động trong vỏ của tôi ( cá, vỏ tương tác thân thiện ). Có vẻ như nó chỉ hoạt động trong bash (mặc định của Ubuntu).

chocobai@pc ~> /bin/bash 
chocobai@pc:~$ quote asdf
'asdf'chocobai@pc:~$ 

chocobai@pc:~$ type quote
quote is a function.
quote ()
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

Nó làm gì? Những gì nó có thể được sử dụng cho?

Nó thêm các trích dẫn nhưng không có dòng mới. Nó cũng thoát khỏi các trích dẫn đơn theo cách phù hợp với bash. Nó có thể hữu ích trong các kịch bản để trích dẫn một biến hoặc một số loại chuỗi khác. Bạn cần điều này ví dụ cho các đường dẫn / tham số có khoảng trắng. Mặc dù có nhiều cách khác để làm điều này.

Thật kỳ lạ khi tôi không thể tìm thấy bất kỳ tài liệu nào (trên web) về nó. Nhưng tốt, thật dễ dàng để xem những gì nó làm.


2
whichlà vô dụng, cả trong vỏ tương tác và trong các kịch bản. Sử dụng typethay thế. type quotesẽ cho bạn biết đó là một hàm và thậm chí hiển thị định nghĩa hàm. Chạy help typeđể biết thêm về typenội dung.
geirha

Bạn nói đúng, cảm ơn. Tôi thấy câu trả lời ở trên cũng sử dụng loại để tìm hiểu nó là gì. Chà, nhờ 'cái' mà tôi biết rằng nó không phải là một tệp thực thi trong / bin / hoặc như vậy, vì nó không trả về bất kỳ đường dẫn nào. Tôi nghĩ rằng nó vẫn còn hữu ích. Nhưng bạn nói đúng, tôi sẽ thêm kiểu.
xác nhận

2
Trong Ubuntu 12.04 của tôi, chức năng này thực sự được mô tả /etc/bash_completion, được lấy ~/.bashrctheo mặc định, không phải do /etc/bash.bashrcphần liên quan /etc/bash_completionđược nhận xét. Ngoài ra /usr/share/bash-completion/thư mục không có trong Ubuntu 12.04.
whtyger

8

quotelà một chức năng được xác định (ở đây trên hệ thống Debian của tôi, nhưng tôi đoán nó giống với Ubuntu) trong tệp /usr/share/bash-completion/bash_completion, chính nó có nguồn gốc từ /etc/bash.bashrclúc khởi động của Bash.

Tôi sẽ không bao giờ sử dụng chức năng này! Nếu bạn cần trích dẫn nội dung để có thể sử dụng an toàn bằng vỏ, vui lòng sử dụng printfvới công cụ %qsửa đổi, như:

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""

Trên thực tế, ngay cả điều này rất hiếm khi được sử dụng, luôn có những chiến lược tốt hơn cho những thứ cấp cao như chúng ta, người dùng, thường làm. Thứ này quoteđược sử dụng nội bộ bởi một số thứ tối nghĩa mà chúng ta thậm chí không muốn biết. Đây quotechức năng có lẽ là một nhà cung cấp / phân phối cụ thể (đọc Debian cụ thể) và có lẽ không phải cầm tay ở tất cả, và thậm chí có thể thay đổi trong phiên bản tương lai.

Biên tập. Tôi vừa kiểm tra trên hệ thống Ubuntu 12.04 và quotechức năng được xác định trong /etc/bash_completion, có nguồn gốc từ /etc/bash.bashrcchính nó /etc/profile.

Làm thế nào tôi xác định điều này? sử dụng một chút heuristic:

  • Kiểm tra nếu quotexuất hiện trong /etc/profile:

    grep '\bquote\b' /etc/profile

    Không. Đi đến bước tiếp theo.

  • Các tập tin có nguồn gốc là /etc/profilegì?

    grep '[[:space:]]\.[[:space:]]' /etc/profile

    Tôi có $i(cần xem xét nguồn để biết nguồn này là gì, nhưng trong trường hợp này là các tệp /etc/profile.d/*.shnếu có (và nếu có thể đọc được) và /etc/bash.bashrc. Tìm kiếm /etc/bash.bashrc.

  • quotetrong /etc/bash.bashrc? có / không, v.v ...

quotethực sự thoát khỏi dấu ngoặc đơn, vì vậy nó có thể được sử dụng bởi shell. Nó hoạt động tốt như printf %qđối với trường hợp sử dụng này.
Flimm

@Flimm sử dụng có nguy cơ của riêng bạn!
gniourf_gniourf

@gniourf_gniourf Tôi nghĩ printf% q không xử lý đúng dấu ngã ( ~ ). Hãy thử điều này : my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Bạn sẽ thấy một cái gì đó như Expected: ~/.bashrc, quote: ~/.bashrcprintf %q: /home/your_username/.bashrc.
Rockallite

1
@Rockallite: Tôi vừa thử nó và nó hoạt động như mong đợi ...
gniourf_gniourf

Nếu bạn muốn chuyển thẳng đến nguồn, bạn có thể sử dụng (shopt -s extdebug; declare -F quote), cho bạn biết tên hàm, số dòng được xác định tại và tên tệp được xác định trong.
wjandrea

3

quote là một chức năng:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

Hàm này được định nghĩa ở đâu đó trong tệp khởi tạo bash. Chính xác hơn, nếu bạn đang sử dụng Ubuntu 13.04, bạn có thể tìm thấy nó ở /usr/share/bash-completion/bash_completiondòng 142.

Sử dụng lệnh sau để kiểm tra:

type quote

Mục đích của nó là rõ ràng rõ ràng.


Những gì nó làm là rõ ràng - nhưng tại sao bạn muốn làm nó có thể không. Để tránh nghi ngờ: nó sẽ được sử dụng để lấy một biến như $INPUT, có thể chứa dấu cách, dấu ngoặc kép hoặc các ký tự khác và trả về một chuỗi chắc chắn chỉ được coi là một đối số duy nhất bằng bash.
Ben XO
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.