2

Каков наилучший способ в * nix (псевдоним, скрипт и т.д.) Сократить доступные параметры для команды, которая не предоставляет краткую форму?

Идея заключалась бы в том, чтобы обернуть команду каким-либо образом, чтобы иметь возможность сокращать только первый вариант. Кроме того, позволяя использовать оригинальные тоже.

Обычная команда:

 > command option1 file.txt
 > command option2 file.txt

Используя обертку:

> command o1 file.txt
> command o2 file.txt

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

 if $first_argument == "o1"
    call <command> option1 $additional_arguments
 else if $first_argument == "o2"
    call <command> option2 $additional_arguments
 else
    call <command> $first_argument $additional_arguments

Будет ли это возможно?

3 ответа3

4

Вы можете создать псевдонимы в вашем файле ~/.bashrc. Например, создание 7-zip-архива папки, которая обычно

7z a -m0=lzma2 -mx=9 -ms=on -mf=on -mtc=on archive_name.7z folder_name

в вашем ~/.bashrc вставьте:

alias 7zipfolder='7z a -m0=lzma2 -mx=9 -ms=on -mf=on -mtc=on'

После этого вы можете просто сделать,

7zipfolder archive_name.7z folder_name

Вам нужно будет выйти и снова войти, чтобы он вступил в силу, или выполните команду source ~/.bashrc.

HTH :)

==== РЕДАКТИРОВАТЬ: Учитывая ответы ниже, ну, я думаю, вы могли бы сделать это, если вы измените PATH для просмотра в ваших личных папках сценариев, например,

PATH = ~/.shortcommands:$ PATH

И затем вы можете создавать сценарии с теми же именами, что и те, которые установлены в, например, /usr /sbin, перебирать все аргументы, расширять те, которые вы хотите, и затем завершать, вызывая "настоящий" сценарий / приложение в его абсолютный путь с переведенным набором опций.

Например

  7z --folder Documents.7z Documents/

звонки

  ~/.shortcommands/7z

который переводит все в:

  /usr/bin/7z a -m0=lzma2 -mx=9 -ms=on -mf=on -mtc=on Documents.7z Documents/

Сам скрипт будет перебирать список аргументов, а затем переводить то, что имеет смысл для ваших нужд. Вы, вероятно, далеки от создания "оболочки" поверх исходной команды, но, очевидно, это не то, что вы ищете. Не уверен, насколько вы опытны в написании сценариев bash, но есть множество очень хороших ресурсов. Просто в качестве примера для итерации аргументов, вот фрагмент из скрипта, над которым я сейчас работаю, который создает / проверяет данные контроля четности и файлы контрольной суммы для других файлов:

# Iterate arguments while shifting off those meant for us, leaving behind files to process.
# No clue how to directly index on the arguments array, so I copy it:
args=("$@")
files=()
files_count=0

# Then we iterate over each argument, collecting anything that's for us, and adding files
# to our files array, making sure to get absolute paths should we somehow get relative ones
# (e.g. from Nautilus or the commandline):
for ((i=0; $i<$#; i++)); do
        argument=${args[$i]}
        # How deep to go into FILE before starting to create/check protection files:
        if [ "$argument" = "-d" -o "$argument" = "--depth" ]; then
                # Seek to the next argument, i.e. the value:
                let "i=i+1"
                # We'll get an error if we try to just grab the next argument and it isn't there:
                if [ $i -eq $# ]; then
                        print_argument_error "${args[$i-1]} needs a value."
                else
                        target_depth="${args[$i]}"
                        # Okay, so is the value sane?
                        if [[ ! $target_depth =~ ^[1-9][0-9]{0,}$ ]]; then
                                print_argument_error "${args[$i-1]} must be 1 or higher."
                        fi
                fi
        # Whether or not to include output from our client commands, too:
        elif [ "$argument" = "-v" -o "$argument" = "--verbose" ]; then
                print_client_output=1
        # Whether or not to verify files:
        elif [ "$argument" = "-V" -o "$argument" = "--verify" ]; then
                check=1
        # Whether or not to create validation files:
        elif [ "$argument" = "-C" -o "$argument" = "--create" ]; then
                verify=1
        # Whether or not to repair files when possible:
        elif [ "$argument" = "-R" -o "$argument" = "--repair" ]; then
                verify=1
                repair=1
        # That's all the arguments we understand, the rest must be files:
        else
                # So we assume anything but an option is an input file or dir. Get the item:
                item="$argument"

                # If it's a file, we get its directory location and convert it to absolute,
                # then prepend the file name back onto that before pushing it onto our files
                # array. If it's a dir, we just convert it to absolute before pushing it:
                if [ -f "$item" ]; then
                        dir="`dirname "$item"`"
                        files[${files_count}]="`cd "$dir"; pwd`/`basename "$item"`"
                        let "files_count=files_count+1"
                elif [ -d "$item" ]; then
                        files[${files_count}]="`cd "$item"; pwd`"
                        let "files_count=files_count+1"
                fi
        fi
done
1

Частично это зависит от того, как команда анализирует свои параметры. Для программ, созданных с использованием библиотеки разбора аргументов popt, есть встроенный механизм псевдонимов, в котором можно создавать параметры псевдонимов, которые расширяются до существующих параметров, используя rc-файл в домашнем каталоге. К сожалению, документация popt предназначена не только для конечных пользователей, но и для разработчиков, желающих использовать библиотеку в своих программах. Однако информацию о /etc/popt и ${HOME}/.popt можно найти на странице руководства раздела 3 для popt в разделе Option Aliasing .

Конечно, это относится только к программам, созданным для использования popt. Как упоминалось выше, универсального механизма не существует, потому что нет единого механизма разбора аргументов, используемого всеми программами. Скрипты и псевдонимы Wrapper - это ресурсы для программ, в которых отсутствует механизм псевдонимов для popt или popt.

0

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

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