2011-04-28 23 views
18

Tôi đang gặp vấn đề tiếp theo trong trình bao MinGW dưới cửa sổ. Tôi có trong số /etc/profile biểu thức tiếp theo của tôi:Biến Bash với dấu cách

export GIT_SSH="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe" 

Điều này không hoạt động khi tôi sử dụng git tìm nạp trên kho lưu trữ cục bộ. Nhưng nếu tôi làm điều đó như thế (dos cách cũ) này nó hoạt động:

export GIT_SSH="/c/Progra~1/TortoiseGit/bin/TortoisePlink.exe" 

Câu hỏi của tôi là:

Làm thế nào tôi có thể làm cho nó hoạt động sử dụng không gian trong biến?

Đối với mục đích thử nghiệm, bạn có thể mô phỏng một cái gì đó như thế này (bất kỳ ví dụ là tốt):

export VAR="/c/Program Files/TortoiseGit/bin/TortoisePlink.exe" 
# and try to execute like this 
$VAR 

Có một giải pháp cho điều này (trừ đề cập trước đó)?

Bất kỳ liên kết/gợi ý nào được đánh giá cao.

Cảm ơn,

Iulian

+0

gì xảy ra khi bạn cố gắng '/ c/Program \ Files/TortoiseGit/bin/TortoisePlink.exe'? Đó là, bao gồm một dấu gạch chéo ngược để thoát khỏi không gian. – chrisaycock

+0

như được đề xuất bên dưới - nó không hoạt động – INS

+0

@chrisaycock: Tôi cũng bị lừa, nhưng đây chỉ là cách để tránh dấu ngoặc kép trong đối số của lệnh xuất. Sau đó chuỗi này được xử lý theo cùng một cách, dấu cách vẫn là dấu cách :-) –

Trả lời

37

Execute nó như thế này: "$VAR". Đây là một trong những gotchas quan trọng nhất trong kịch bản shell bởi vì các chuỗi luôn được thay thế theo nghĩa đen và bất kỳ dấu cách nào được coi là dấu phân tách mã thông báo chứ không phải là ký tự của chuỗi. Hãy suy nghĩ của việc thay thế một biến như một loại mã dán trong thời gian chạy.

Điều gì thực sự xảy ra khi bạn viết $VAR là vỏ cố gắng thực thi nhị phân /c/Program với đối số đầu tiên Files/TortoiseGit/bin/TortoisePlink.exe.

Tôi đã học được điều này một cách khó khăn bằng cách nhận được một lỗi cú pháp lạ trong một kịch bản lệnh shell lớn cho một đầu vào cụ thể. Không có ngôn ngữ nào khác mà tôi có thể nghĩ đến có thể khiếu nại về lỗi cú pháp nếu đầu vào thời gian chạy chứa các ký tự đặc biệt - nhưng đó là bản chất của kịch bản lệnh shell từ trình thông dịch lệnh như bash và sh giải thích dòng mã.

Bất cứ khi nào bạn mong đợi một chuỗi chứa khoảng trắng và bạn không muốn coi nó là các mã thông báo riêng biệt, hãy kèm theo nó trong dấu ngoặc kép.

+0

@Iulian: sau đó bạn không có cách nào khác ngoài thay đổi tập lệnh khác ... hoặc không có dấu cách. Git ban đầu được thiết kế cho các hệ điều hành giống Unix và các đường dẫn với không gian không phù hợp với các quy ước của họ. –

+5

Nếu git đang gọi nó mà không trích dẫn, thì đó là lỗi GIT và cần được báo cáo. –

7

Để tham khảo, tôi đã giải quyết một vấn đề tương tự trên OSX bằng cách đóng gói đối số với các trích dẫn thoát. Đây có thể không phải là giải pháp tốt nhất, nhưng có vẻ như nó hoạt động.

alias sub="\"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl\"" 
-1

Tôi đã giải quyết nó theo cách đơn giản nhất:

xuất khẩu GIT_SSH =/c/Chương trình \ Files/TortoiseGit/bin/TortoisePlink.exe

+1

Trong khi kỹ thuật khả thi, bạn có thể nhận được upvotes (thay vì downvotes) nếu bạn giải thích những gì bạn đã làm. Ai đó đấu tranh với điều này sẽ không hiểu ý nghĩa của những gì bạn đã đưa ra. – zaTricky

Các vấn đề liên quan