Могу ли я изменить команду терминала для выполнения дополнительных действий?

8

Я посмотрел на псевдонимы, функции ... но я не придумал ничего удовлетворительного. Позвольте мне дать вам пару сценариев:

  • 95% раз, что я cdв папку, я выполняю ls команду.
  • 90% раз, что я mkdir, я cdсам в это.

Вы поняли идею.

Каков был бы самый «чистый» способ связать эти команды вместе (или другой функционал)?

Карлес Алколея
источник
5
Почему псевдонимы не работают для вас?
Турбьёрн Равн Андерсен
2
Так должен ли результат cd mkdir прилипать к ls?
bmike
@bmike Хорошо, только что созданный каталог будет пуст, поэтому ls ничего не печатает.
Random832,
@ Random832 вы полагаете, что на ls нет флагов, но, что более важно, мой вопрос покажет, насколько сломанным / тяжелым рукой нужно изменение. Я предпочитаю псевдонимы функциям, но оба могут попытаться ответить на вопрос.
bmike
1
@ fd0 Я не сомневаюсь, что псевдонимы не сработали. Я спрашиваю почему. Там может быть более простое решение проблемы.
Турбьерн Равн Андерсен

Ответы:

4

Вы можете поместить эти строки в свой .zsrhcили.bashrc

[ -z "$PS1" ] && return
function cd {
builtin cd "$@" && ls -F
}

Результат ->

введите описание изображения здесь

Объяснение из этого ответа :

Ранее в моем .bashrc у меня было возвращение: [-z "$ PS1"] &&, и все после этой строки относится только к интерактивным сеансам, так что это не влияет на поведение cd в скриптах.

Дальнейшая информация из этого комментария :

[-z "$ PS1"] проверяет, равна ли $ PS (переменная интерактивного приглашения) "нулевой длине" (-z). Если это нулевая длина, это означает, что он не был установлен, поэтому Bash не должен работать в интерактивном режиме. На этом этапе & возвращаемая часть выходит из источника .bashrc, в этих условиях.

Кстати, спасибо за вопрос, это действительно круто :)

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

Другим решением было бы интегрировать ваш ls в вашу подсказку; Я уверен, что вы можете сделать это с OhMyZsh;)

StrawHara
источник
1
Как правило, не используйте то же имя, что и стандартные команды, как cd ls rm и т. Д., Так как вам нужно будет использовать эти стандартные команды
user151019
@ Марк, я согласен с 'rm -rf ~ / *' ^^ Но для команды cd это не очень опасно. И Карлес хочет «обновить существующие команды», так что ...
StrawHara
Я должен сказать, что я использовал это решение с тех пор, как @StrawHara опубликовал его, и у меня было 0 проблем. Я хотел представить «как все прошло» :) И это действительно полезно; Вот как я это использую (.zshrc): i.imgur.com/WHpROIE.png
Карлес
13

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

go() {
    if [ -d "$1" ]; then
        cd "$1" && ls
    else
        mkdir -p "$1" && echo "Created directory $1" && cd "$1"
    fi
}
Random832
источник
Мне нравится ваша идея объединить эти! :-)
Мартин Аллерт
5
Этот ответ также является самым чистым, поскольку он не нарушает стандартное определение cd / mkdir при использовании сценариями
holroy
1
Конечно, но что если вы решите начать использовать язык программирования Go? : P
arxanas
@arxanas: Вы используете make-файлы? ;-)
DevSolar
2
хм, мне нравится этот. но если вы случайно набрали неверное имя, вы создаете новый каталог. Это трудно осуществить проверку на отпуск (CD /.... или ../или что - то) и удалить каталог , если он пустой? Я имею в виду, если вы покидаете каталог, просто проверьте, если он пуст, и если так, удалите его. если вы не хотите этого, вы все равно можете использовать CD вместо Go
Schwertspize
6

Я попытался добавить такие вещи в мой .bashrc:

cd() {
    command cd "$@"
    command ls
}

mkdir() {
    command mkdir "$@"
    command cd "$@"
}

Однако я обнаружил, что это может испортить сценарии, использующие переопределенные команды, и обработка параметров может быть хрупкой (например, если вы хотите передать -pвышеуказанную mkdirкоманду, она также передается cd). Лучше было бы просто определить псевдонимы с разными именами (скажем, cили mcd).

arxanas
источник
1
вставка [ -z "$PS1" ] && returnв конце файла перед этими функциями должна помочь
Carles Alcolea
5

Я думаю, что функции - это путь. Что-то вроде

chglist() {
    cd "$1" && ls
}

Например.

fd0
источник