2016-12-03 6 views
0

Сценарии ярлыков сценариев или псевдонимы очень полезны для автоматизации повторяющихся задач за очень малые штрихи.Как создать псевдоним оболочки для создания нового скрипта и открытия его в редакторе?

Одним из примеров примера команды «быстрого доступа» является take от zsh, который делает mkdir $dir && cd $dir.

Я хочу сделать что-то подобное (medit), что делает это: когда называют medit script.sh:

  • создает сценарий
  • делает его исполняемым (CHMOD + х)
  • заполнит его хижину линии
  • открывает файл в редакторе по умолчанию

Могу ли я сделать это, используя lias, поэтому я бы не написал сценарий bash, который делает это?

ответ

2

Лучше написать функцию, как:

function medit(){ 
    echo "#!/bin/bash" > "$1" 
    chmod +x "$1" 
    if [ -n "$VISUAL" ]; then 
     "$VISUAL" "$1" 
    elif [ -n "$EDITOR" ]; then 
     "$EDITOR" "$1" 
    else 
     vi "$1" 
    fi 
} 

Положите его в .bashrc и назвать его medit script.sh Это первый будет пытаться запустить редактор, указанный в $VISUAL и $EDITOR и возвращается к vi, если есть не указан стандартный редактор.

+0

Я бы 'тест -f' файла перед созданием нового. –

3

Я хотел бы написать что-то вроде этого:

# Usage: just like 'builtin printf' 
fatal_error() { 
    builtin printf "[email protected]" >&2 
    exit 1 
} 

# Usage: medit [file] [more arguments] 
medit() { 
    # If we have arguments 
    if [ $# -gt 0 ]; then 
    # If $1 file does not exist, or is empty, 
    # put a shebang line into it. See `help test`. 
    if [ ! -s "$1" ]; then 
     printf "%s\n" "#!/bin/bash -" > "$1" || \ 
     fatal_error "Failed to write to %s\n" "$1" 
    fi 

    # Make $1 executable 
    chmod +x "$1" || fatal_error "failed to chmod %s\n" "$1" 
    fi 

    # Run the default editor with the arguments passed to this function 
    "${EDITOR:-${VISUAL:-vi}}" "[email protected]" 
} 

Команда medit может быть вызвана так же, как редактор по умолчанию, даже без аргументов.


На авось, что вы не знаете, как повторно использовать сценарий выше, поставить код в какой-то ~/scripts/medit и source его из соответствующего сценария инициализации, таких как ~/.bashrc: source ~/scripts/medit.

+0

Довольно замечательная реализация. Я вижу одну ошибку: она должна создавать файл только в том случае, если он не существует, поскольку мы не хотим несчастных случаев. Другие замечания - это только личное предпочтение не определять новую функцию полезности только для сохранения двух строк кода, но это только предпочтение. – sorin

+0

@sorin, добавил '[! -s "$ 1"] 'test –

0

То, о чем вы просите, является псевдонимом.
Невозможно сделать все, что вы просите, не используя одну или несколько функций.
Но есть способ сделать псевдоним определить некоторые функции, а также их называют:

alias medit=' 
SayError(){ local a=$1; shift; printf "%s\n" "$0: [email protected]" >&2; exit "$a"; } 
medit(){ 
    [[ $# -lt 1 ]] && 
     SayError 1 "We need at least the name of the file as an argument" 
    [[ ! -s $1 ]] && echo "#!/bin/bash" > "$1" || 
     SayError 2 "File $1 already exists" 
    chmod u+x "$1" || 
     SayError 3 "File $1 could not be made executable" 
    ${VISUAL:-${EDITOR:-emacs}} "$1" || 
     SayError 4 "File $1 could not be open in the editor" 
} 
\medit' 

Вы должны выполнить приведенное выше определение псевдонима medit или поместить его в ~/.bashrc, или просто источником его в управлении чтобы он существовал.

Затем, когда вызывается псевдоним, он определяет две функции: SayError и medit.
Да, функция с тем же именем, что и псевдоним: medit.

После определения функции, псевдоним будет вызывать функцию, используя хитрость:

\medit 

As (строго говоря) а \medit не совсем псевдоним medit, Баш продолжает искать и находит функцию medit, который к тому времени был определен и выполнен.

Конечно, вы можете просто определить функции и использовать их, не прибегая к псевдониму для определения функций, это ваш выбор.

Приятно иметь выбор. :)

Это, как вы могли бы определить все в соерсед файле:

alias medit='\medit' 
SayError(){ local a=$1; shift; printf "%s\n" "$0: [email protected]" >&2; exit "$a"; } 
medit(){ 
    [[ $# -lt 1 ]] && 
     SayError 1 "We need at least the name of the file as an argument" 
    [[ ! -s $1 ]] && echo "#!/bin/bash" > "$1" || 
     SayError 2 "File $1 already exists" 
    chmod u+x "$1" || 
     SayError 3 "File $1 could not be made executable" 
    ${VISUAL:-${EDITOR:-emacs}} "$1" || 
     SayError 4 "File $1 could not be open in the editor" 
}