1

Я пытаюсь создать псевдонимы для команд, которые я много печатаю. Поскольку я работаю над большим проектом, построенным на Laravel, мне нужно довольно часто использовать инструмент командной строки artisan. Тем не менее, я не часто хочу быть в корневом каталоге с этим файлом.

Мне обычно не приходится подниматься вверх в написанных мной сценариях, поэтому я немного растерялся. Моя первая мысль - попытаться использовать команду типа find . -name artisan и, если ничего не находит, перейдите на cd .. и проверяйте снова, пока текущий рабочий каталог не будет / . Затем я хочу иметь возможность передать аргументы из сценария оболочки в окончательную, найденную копию ремесленника.

Существует ли утилита / соглашение для терминала linux / unix / osx, которая позаботится об этом?

Редактировать:

Извините, я должен был прояснить это раньше, но я не думал об этом.

artisan - это CLI-интерфейс к фреймворку Laravel PHP. Я работаю в версии 3, но если я начну другой проект в нем, я, вероятно, буду использовать версию 4. Между этими версиями существует множество критических изменений, но, что более важно, artisan скрипт в корне проекта - это всего лишь скрипт начальной загрузки для кода, живущего внутри фреймворка.

Например, поскольку он имеет локальные зависимые от версии зависимости от ссылки на paths.php , которая сообщает ему, где другие ресурсы похожи на сам фреймворк, я не думаю, что могу переместить это в каталог bin и символическую ссылку на него.

Да, я могу ссылаться на скрипт из подкаталогов, но я искал что-то более автоматическое, чем это. Например, как Git находит каталог репозитория из подкаталога? Я знаю, что он должен вернуться вверх в дереве, чтобы найти его, но, поскольку он находится в CI, затрудняется найти его или реализовать в сценарии Shell/Bash.

3 ответа3

3

Вы можете найти файл в текущем каталоге и, если он не найден, пройтись по файловой системе до тех пор, пока вы не найдете файл или не достигнете корня. Например:

#!/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'."

Здесь мы обнаруживаем, что достигли корня, заметив это. и .. ссылаются на тот же каталог.

1

Благодаря ответу Мавита и комментариям Скотта, я нашел хорошее рабочее решение. Я использую это на Mac OS X 10.6.8, но он должен быть очень портативным.

#!/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" "$@"
0

Если вы ищете одну конкретную команду (и знаете, где она должна быть), почему бы не вызвать ее с полным путем, например /usr/local/bin/path/to/artisan , или добавить каталог artisan в переменную PATH ,

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .