Tìm một tập tin trong CWD hoặc bất kỳ cha mẹ của nó


1

Tôi đang cố gắng tạo bí danh cho các lệnh Tôi đang gõ rất nhiều. Bởi vì tôi đang làm việc trong một dự án lớn được xây dựng trên Laravel, tôi cần sử dụng công cụ công cụ dòng lệnh khá thường xuyên. Tuy nhiên, tôi thường không muốn ở trong thư mục gốc với tệp đó.

Tôi thường không phải tái phát trở lên trong các kịch bản tôi đã viết, vì vậy tôi có một chút mất mát. Suy nghĩ đầu tiên của tôi là cố gắng sử dụng một lệnh như find . -name artisan và nếu nó không tìm thấy gì, để cd .. và kiểm tra lại cho đến khi thư mục làm việc hiện tại là /. Sau đó, tôi muốn có thể chuyển các đối số từ kịch bản shell đến bản cuối cùng, tìm thấy bản sao của nghệ nhân.

Có một tiện ích / quy ước thiết bị đầu cuối linux / unix / osx sẽ lo việc này không?

Chỉnh sửa:

Xin lỗi, tôi nên đã rõ ràng về điều này trước đây, nhưng tôi đã không nghĩ về nó.

artisan là giao diện CLI cho Ấu trùng Khung PHP. Tôi làm việc trong phiên bản 3, nhưng nếu tôi bắt đầu một dự án khác trong đó, tôi có thể sẽ sử dụng phiên bản 4. Nhiều thay đổi đột phá tồn tại giữa các phiên bản này, nhưng quan trọng hơn là artisan tập lệnh trong thư mục gốc của dự án chỉ là tập lệnh bootstrap cho mã sống trong khung.

EG, bởi vì nó có các phụ thuộc cục bộ, nhạy cảm với phiên bản paths.php tài liệu tham khảo, cho biết nơi các tài nguyên khác giống như khung công tác, tôi không nghĩ rằng tôi có thể chuyển tài nguyên này sang bin thư mục và symlink đến nó.

Có, tôi có thể liên kết xuống kịch bản từ các thư mục con, nhưng tôi đang tìm kiếm thứ gì đó tự động hơn một chút. Ví dụ, làm thế nào Git đi về việc định vị thư mục kho lưu trữ từ thư mục con? Tôi biết nó phải lặp lại ở trên cây để xác định vị trí của nó, nhưng vì nó ở C tôi không biết làm thế nào để tìm thấy nó, hoặc thực hiện nó trong tập lệnh Shell / Bash.


Nhân tiện, đây là một ví dụ về Nhận thức về Git , được sử dụng cho dấu nhắc của Bash, dựa trên Hoàn thành bash
slhck

Câu trả lời:


3

Bạn có thể tìm tệp trong thư mục hiện tại và nếu không tìm thấy, hãy tìm đường đi qua hệ thống tệp cho đến khi bạn tìm thấy tệp hoặc bạn đến được thư mục gốc. Ví dụ:

#!/bin/bash

wanted=$1

dir=.
while [[ ! -x "$dir/$wanted" ]]; do
    if [[ "$dir" -ef "../$dir" ]]; then
        echo "Could not find '$wanted'." 1>&2
        exit 2
    fi
    dir="../$dir"
done

echo "Found '$dir/$wanted'."

Ở đây, chúng tôi phát hiện ra rằng chúng tôi đã đạt được root bằng cách nhận thấy điều đó. và .. tham khảo cùng thư mục.


1
Xuất sắc! Tôi sẽ viết cái này nếu có ai đó khác. Ghi chú: (1) Tôi đề nghị wanted=$(basename $0), vì vậy kịch bản có thể được gọi artisan; (2) thêm một kiểm tra cho [[ "$0" -ef "$dir/$wanted" ]], để xử lý trường hợp người dùng chạy tập lệnh từ bin thư mục (hoặc thư mục con của nó); và (3) xóa (bình luận) trận chung kết echo và thay thế nó bằng một exec.
Scott

Mavit và @Scott Cảm ơn bạn đã giúp đỡ. Tôi sẽ đăng kịch bản cuối cùng dưới dạng câu trả lời của riêng tôi để người khác có câu hỏi tương tự có thể có một bản sao.
Robert K

1

Nhờ vào Câu trả lời của Mavit Bình luận của Scott , Tôi đã đưa ra một giải pháp làm việc tốt. Tôi sử dụng điều này trên Mac OS X 10.6.8, nhưng nó rất dễ mang theo.

#!/bin/bash

wanted=$(basename $0)

dir=.
while [[ ! -x "$dir/$wanted" ]]; do
    if [[ "$dir" -ef "../$dir" ]]; then
        echo "$wanted is not in the current directory or any of its parents" 1>&2
        exit 2
    fi

    dir="../$dir"
done

# Find the absolute path to the command
dir=$(cd -- "$dir" && pwd)

if [[ "$dir/$wanted" -ef "$0" ]]; then
    echo "Cannot call self."
    exit 2
fi

# Execute the command and pass in $1... parameters to it.
exec "$dir/$wanted" "$@"

Dòng cuối cùng phải là exec $dir/$wanted "$@", để xử lý trường hợp tập lệnh được gọi với một đối số có khoảng trắng trong đó (ví dụ: artisan 'foo bar' ). Để được an toàn gấp đôi, exec "$dir/$wanted" "$@", vì vậy bạn có thể đổi tên kịch bản để có một khoảng trắng trong tên của nó hoặc xử lý trường hợp đường dẫn đầy đủ của thư mục (đầu ra từ pwd ) chứa không gian (s). (Tương tự, basename "$0".) Và bạn đã bao gồm kiểm tra để ngăn tập lệnh tự thực thi chưa? Tôi không thấy nó.
Scott

@Scott Bạn đề nghị tôi nên kiểm tra ở đâu?
Robert K

Có vẻ như bạn đã tìm ra nó.
Scott

0

Nếu bạn đang tìm kiếm một lệnh cụ thể (và bạn biết nó nên ở đâu), tại sao không gọi nó với đường dẫn đầy đủ như /usr/local/bin/path/to/artisanhoặc thêm thư mục của artisan vào biến PATH của bạn.


Điều gì xảy ra nếu tôi có nhiều dự án với các phiên bản khác nhau của khung? Giữa Laravel 3 và 4 có nhiều thay đổi đột phá và cả hai phiên bản đều mong đợi một paths.php tập tin được trong tuyến đường địa phương của họ.
Robert K
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.