2013-07-03 7 views
3

я часто пишу что-то вроде этого:командная оболочка и завершение

cp -r folder-0.0.1 ~/temp 
cp -r folder-0.2.2 ~/temp 
cp -r folder-1.0.0 ~/temp 

Шаблон: <comand> <name>-<version> <path>

Но вместо этого, я хотел бы написать это:

do_something 0.0.1 
do_something 0.2.2 
do_something 1.0.0 

Шаблон: <alias> <version>

Могу ли я сделать это легко в , используя aliase s?

Я также хотел бы получить соответствующее завершение с помощью tab ключ для правильной работы. Как я могу выполнить завершение для достижения этого?

+0

Относительно запроса на закрытие: вопрос также о завершении программирования! –

ответ

4

Not with aliases.

do_something() { 
    cp -r folder-"$1" ~/temp 
} 
+0

ОК, но у меня есть одна проблема с вкладкой + вкладка autocomplete. Когда я использую tab + tab Bash write folder- после so_something. И когда я делаю это, это выглядит как папка-папка . Можно ли это исправить? –

+0

bash write = bash предлагает написать в этом случае. –

+0

Конечно. Измените функции автозаполнения. Нет, я не знаю, как. –

1

Как Ignacio Vazquez-Abrams уже упоминалось, не используют псевдонимы. Фактически, это даже записано в Aliases section of the reference manual:

Для почти всех целей функции оболочки предпочтительнее над псевдонимами.

Таким образом, вы будете нуждаться в этой функции:

do_something() { 
    [[ -n $1 ]] && cp -rnvt ~/test folder-"$1" 
} 

Если вам не нравится, как я написал cp со всеми опциями, просто удалите их. Для информации:

  • -n так, чтобы не перезаписать существующий файл/папку
  • -v так, чтобы быть многословным
  • каталог Следующий -t является целевой каталог

(мне нравится напишите мой cp s вот так, ваша версия cp может не справиться с этим, но, скорее всего, так и будет).

Существует также проверка, чтобы убедиться, что аргумент был дан до запуска cp.

До сих пор нет ничего лучше, чем другие ответы. Что касается завершения, вот что вы можете сделать:

_do_something() { 
    COMPREPLY=($(
     shopt -s nullglob extglob 
     files=(folder-+([[:digit:].])/) 
     for ((i=0;i<${#files[@]};++i)); do 
      files[i]=${files[i]#folder-} 
      files[i]=${files[i]%/} 
     done 
     compgen -W "${files[*]}" -- "${COMP_WORDS[COMP_CWORD]}" 
    )) 
    return 0 
} 

complete -F _do_something do_something 

Поместите это в .bashrc (хотя это, вероятно, не самое лучшее место для доработок, вы будете настроить все это, когда вы более опытный) и наслаждайтесь!

Оттуда вы захотите расширить его до тех пор, пока он не станет прекрасным сценарием на 100000 строк. Например, я добавил параметр -n в cp (я считаю, что это классная функция безопасности). Затем вы можете добавить опции в функцию do_something, например опцию --force, которая удалит эту опцию -n. Я не буду делать это за вас (и это выходит за рамки этого ответа), но это не так сложно.Затем убедитесь, что вы также соответствующим образом измените функцию завершения! Это очень весело.

Смежные вопросы