2011-01-05 18 views
8

Tôi là người dùng Windows và Linux lâu năm (tôi không có gì chống lại Mac - tôi chưa bao giờ sở hữu một máy Mac) và trước đây đã có một số trải nghiệm lạ khi viết kịch bản shell trên Mac OS X. Cụ thể, tôi có thể viết các tập lệnh tốt và chạy chúng từ thiết bị đầu cuối, nhưng mỗi khi tôi cố gắng chạy một từ một cửa sổ Finder nó luôn luôn thực hiện từ thư mục nhà của người dùng chứ không phải là thư mục trong đó kịch bản sống. Tức là, nếu tập lệnh được đặt tạiShell Scripts trong Mac OS X chạy từ thư mục chính?

~/path/to/the/script.sh 

nó luôn hết trong số ~. Trước đây tôi đã phải hỏi nhiều bạn bè hiểu biết về Mac hơn về cách sửa lỗi này, và họ thường làm như vậy bằng cách sử dụng một số kỹ thuật tồi tệ khủng khiếp, nhưng tôi không thấy lý do nào tại sao điều này lại xảy ra.

Câu hỏi của tôi là - có cách nào dễ dàng để viết kịch bản lệnh shell trong Mac OS X, khi nhấp đúp vào Trình tìm kiếm, chạy ra khỏi thư mục chứa nó?

+1

Tại sao bạn mong đợi nó sẽ làm khác? Đây chỉ là hành vi được xác định. – bmargulies

+0

"thư mục gốc"! = "Thư mục chính của người dùng" –

+0

Ít nhất trong Windows, hành vi mặc định bạn nhận được khi chạy một chương trình từ cửa sổ thám hiểm là chương trình đang chạy ra khỏi thư mục mà nó cư trú. Có lẽ đây là ngoại lệ thay vì quy tắc, nhưng đó là điều tôi thường hay sử dụng nhất. – templatetypedef

Trả lời

13

Hành vi có vẻ phù hợp với tôi. Nó kế thừa môi trường của trình tìm kiếm của bạn, nó sẽ được bắt nguồn từ thư mục chủ của bạn.

Tuy nhiên, không quá khó để khắc phục.

cd "$(dirname "$0")" 

Ought để làm các trick ala:

richh-desktop % fullname.sh 
/home/richh/bin 
richh-desktop % cd .. 
richh-desktop % fullname.sh 
/home/richh/bin 
richh-desktop %   
+0

Hãy trích dẫn đường dẫn kép trong trường hợp có không gian trong bất kỳ tên tệp nào (đây là OS X - tên tệp có dấu cách trong đó): 'cd" $ (dirname "$ 0") "' –

+0

@Gordon Davisson: Cảm ơn. – richo

1

Sẽ tùy thuộc vào tập lệnh để thay đổi thư mục cho bạn. Kiểm tra this page.

1

Mục đích của $0 là để giải quyết vấn đề này.

2

Nếu bạn muốn tập lệnh chạy hết thư mục, tập lệnh sẽ phải thay đổi thư mục làm việc của tập lệnh. Do ví dụ của bạn được viết bằng bash, tôi sẽ trả lời bằng ví dụ bash. Giá trị $ _ được đặt thành đường dẫn tuyệt đối của tập lệnh hiện tại. Bạn có thể tìm thêm thông tin bằng cách chạy man bash

#!/bin/bash 

PROGPATH=$(dirname $_) 
cd $PROGPATH 

# Do your stuff here 
Các vấn đề liên quan