1

Постоянно обнаруживаю, что запускаю команды bash и продолжаю редактировать команду (используя режим vi), чтобы все получилось правильно.

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

Иногда я сохраняю такие команды в файл, редактирую файл, запускаю его снова и т.д., Но это заставило меня задуматься ...

Есть ли более интерактивный способ перебора команды bash? Больше похоже на REPL, так что проще редактировать входные данные для команд?

Например, скажите, что я повторяю следующую команду. Какой простой способ обновить "test", "super" и «java $», не перепрыгивая через команду в режиме vi или редактируя ее в скрипте?

$ find . | grep test | grep super | grep java$

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

$ curl "http://example.com/$PATH/$PARMS"

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

1 ответ1

0

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

$ echo "hi $(ask name), how $(ask old) are you?"
:name (This is a prompt. I supplied "brad" as the value)
:old  (This is another prompt. I supplied "young" as the value)

hi brad, how young are you?

Если я запускаю его второй раз, он запоминает, что я дал для ввода (он сохраняет их во временном файле в /tmp). Это можно отключить, передав "нет" в качестве второго параметра.

$ echo "hi $(ask name), how $(ask old) are you?"
:brad (This is a prompt. I supplied "parks" as the value)
:young  (This is another prompt. I hit enter to use the default value)

hi parks, how young are you?

Замечания:

  • Все tmp файлы можно удалить, запустив ask clear
  • Справка может быть отображена с ask help
  • Для этого требуется bash 4.x, так как read -i недоступно в старых версиях bash. Это должно предоставить ask значение по умолчанию. Вы можете обновить bash, используя homebrew.

Вот сценарий!

просить

#!/usr/local/bin/bash
me=$(basename "$0")

show_help()
{
it=$(cat <<EOF
  Prompts you for info, allowing a default value that can also
  be updated by being stored in a tmp file.

  Useful for interactively replacing parts of a bash command 
  you're running with a new value easily, instead of having 
  to manually edit the command all the time.

  usage: $me {default_value} {tmp_key} 

  e.g. 

    $me        -> asks for input

    $me HI     -> asks for input, with "HI" supplied as default value. 
                  Saves the user supplied value in a tmp file, and 
                  uses that as the default the next time it's run

    $me 1 no   -> asks for input, with 1 supplied as default value. 
                  If tmp_key is any value other than "no", will 
                  save the user supplied value in a tmp file, and 
                  use that as the default the next time it's run

    $me clear  -> removes any tmp files that have been created.

  A more real example, the following will curl an url at
  a site, and constantly ask you for the page you want to hit,
  remembering the last value you used in a tmp file.

  $ curl http://httpbin.org/\$($me somePage)
EOF
)
  echo "$it"
  exit
}

# Store tmp files in a folder
tmp_file_path="/tmp/__${me}"
mkdir -p "$tmp_file_path"

prompt=":"

if [ "$1" = "help" ]
then
  show_help
fi
if [ "$1" = "clear" ]
then
  rm -fr "$tmp_file_path"
  echo "Removed any tmp files from $tmp_file_path"
  exit;
fi

# Initialize our default value and tmp file name
default_value=${1:-""}
tmp_key_default=$(echo "$default_value" | head -n1 | tr -cd '[[:alnum:]]._-')
tmp_key=${2:-"no"}
if [ -n "$1" ]
then
  if [ -z "$2" ]
  then
    tmp_key=$tmp_key_default
  fi
fi

# Convert tmp_key to lower case
tmp_key=$(echo "$tmp_key" | tr '[:upper:]' '[:lower:]')

# Get the default value to prompt with
tmp_file="$tmp_file_path/$tmp_key"
if [ "$tmp_key" != "no" ]
then
  if [ -f "$tmp_file" ]; then
    default_value=$(cat "$tmp_file")
  fi
fi

# Ask the user for input, supplying the default
read -r -e -p "$prompt" -i "$default_value" result
echo "$result"

# Save the new value to a tmp file if we're supposed to
if [ "$tmp_key" != "no" ]
then
  echo "$result" > "$tmp_file"
fi

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