Ошибка при запуске скрипта в bash

Я написал сценарий в bash для создания псевдонимов, но по какой-то причине он не работает в некоторых случаях. Вот код:

#!/bin/bash
#Script to create unique and permanent aliases

_add_alias()
{
    echo "alias $1='$2'" | sudo tee -a $HOME/.bash_aliases
    echo "Alias successfully created"
}

if [ `cat $HOME/.bash_aliases | grep "alias $1=" | wc -l` == 0 ]
    then
    if [ $# -eq 2 ]
        then
        if [ -f "$2" ] #This condition is always false, don't know why.
            then
            _add_alias $1 "$2"
        elif $2 > tmp.txt 2> tmp.txt
            then
            _add_alias $1 "$2"
        else
            echo "Wrong command"
        fi
        rm tmp.txt
    elif [ $# -gt 2 ]
        then
    echo "Error: Usage: addal alias_name 'command' (comand between quotes)"
    elif [ $# -lt 2 ]
        then
        echo "Wrong number of parameters"
    fi
else
    echo "Alias name already exists"
fi

Надеюсь, вы могли бы помочь мне исправить скрипт.

1
задан 16 April 2015 в 14:05

2 ответа

Вот ваши ошибки (источник):

SC2002 Бесполезный кот. Рассмотрим 'cmd & lt; файл | .. 'или' cmd-файл | .. 'вместо этого. SC2006 Используйте $ (..) вместо устаревшего `..`. SC2046 Чтобы предотвратить расщепление слов, сделайте это. SC2086 Двойная цитата, чтобы предотвратить глобирование и разбиение слов. SC2126 Рассмотрите возможность использования grep -c вместо grep | wc.
   1  #!/bin/bash
   2  #Script to create unique and permanent aliases
   3  
   4  _add_alias()
   5  {
   6      echo "alias $1='$2'" | sudo tee -a $HOME/.bash_aliases
                                             ^––SC2086 Double quote to prevent globbing and word splitting.
   7      echo "Alias successfully created"
   8  }
   9  
  10  if [ `cat $HOME/.bash_aliases | grep "alias $1=" | wc -l` == 0 ]
           ^––SC2046 Quote this to prevent word splitting.
           ^––SC2006 Use $(..) instead of legacy `..`.
                ^––SC2086 Double quote to prevent globbing and word splitting.
                ^––SC2002 Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.
                                      ^––SC2126 Consider using grep -c instead of grep|wc.
  11      then
  12      if [ $# -eq 2 ]
  13          then
  14          if [ -f "$2" ] #This condition is always false, don't know why.
  15              then
  16              _add_alias $1 "$2"
                             ^––SC2086 Double quote to prevent globbing and word splitting.
  17          elif $2 > tmp.txt 2> tmp.txt
  18              then
  19              _add_alias $1 "$2"
                             ^––SC2086 Double quote to prevent globbing and word splitting.
  20          else
  21              echo "Wrong command"
  22          fi
  23          rm tmp.txt
  24      elif [ $# -gt 2 ]
  25          then
  26      echo "Error: Usage: addal alias_name 'command' (comand between quotes)"
  27      elif [ $# -lt 2 ]
  28          then
  29          echo "Wrong number of parameters"
  30      fi
  31  else
  32      echo "Alias name already exists"
  33  fi
2
ответ дан 23 May 2018 в 21:24

Здесь вы скорректированный и улучшенный скрипт:

#!/bin/bash

###################################################
## Script to create permanent and unique aliases ##
###################################################

## alias is equal to the first argument.
alias="$1"

## command is equal to an array holding all
## the positional parameters minus the first.
## (i.e. for "ls -la" it would be ["ls, "-la"]).
command=("${@:2}")

## If .bash_aliases exists, load it. Now the alias check
## will take in account any alias not sourced yet on the current shell.
test -f ~/.bash_aliases && source $_

## If there are less than 2 parameters, prints the usage and exits.
if [ $# -lt 2 ]; then
    echo "Usage: $0 <alias_name> <command>"
    exit 1
fi

## If the command is not valid, prints an error and exits.
if ! type "${command[0]}" &> /dev/null; then
    echo "Wrong command"
    exit 3
fi

## If the current alias already exists, prints a error message and then exits.
if [[ "$(type -t '$alias')" == "alias" ]]; then
    echo "This alias alredy exists"
    exit 2
fi

## Append the alias to the .bash_aliases file.
echo "alias $alias='${command[@]}'" >> ~/.bash_aliases

## Print a sucess message.
echo "Alias '$alias' linked to the command '${command[@]}'!" 

Вещи, которые я изменил:

Прокомментированный код. Использовал type, чтобы определить, существует ли псевдоним. Удалена функция, потому что я думаю, что это не обязательно. Использовал type, чтобы определить, действительна ли команда или нет. Удалено ненужное elif. Улучшено условие. command может быть некорректным (т. е. myscript pingoogle ping google.com)
2
ответ дан 23 May 2018 в 21:24
  • 1
    Я попробовал и все еще не работает. Обратите внимание, что «$ HOME / .bash_aliases» требуется разрешение sudo, поэтому я использовал sudo tee -a – Francisco Gallego Salido 14 April 2015 в 14:44
  • 2
    Зачем нужны разрешения sudo? – Helio 14 April 2015 в 14:52
  • 3
    Не знаю, почему, но работает так, и все. – Francisco Gallego Salido 14 April 2015 в 14:54
  • 4
    не работает с "ls -la" как псевдоним – A.B. 14 April 2015 в 15:07
  • 5
    @FranciscoGallegoSalido -Almost- Все в вашем домашнем каталоге должно быть вашим, и не должно требовать sudo. Убедитесь, что вы являетесь владельцем файла ~/.bash_aliases. Если раньше вы запускали sudo, то, скорее всего, root взял на себя ответственность. Возвращайтесь обратно с sudo chmod $USER: ~/.bash_aliases – Dan 21 April 2015 в 11:38

Другие вопросы по тегам:

Похожие вопросы: