Я написал скрипт на 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
Надеюсь, вы поможете мне исправить сценарий.
Некоторые мысли:
myscript alias1 "$HOME/dir/ascript"
оценит в тестовой части к
[ -f '/home/me/dir/ascript' ]
который может быть TRUE или FALSE.
myscript alias2 '$HOME/dir/anotherscript'
оценит в тестовой части к
[ -f '$HOME/dir/ascript' ]
то, которое всегда является ложью (если у Вас нет dir, назвало $HOME в локальном dir).
и
myscript alias3 "$HOME/dir/sample.sh foo bar"
оценит в тестовой части к
[ -f '/home/me/dir/sample.sh foo bar' ]
который является ложью, если нет 'sample.sh файл' панели нечто в /home/me/dir
.
и необходимо зафиксировать .bash_aliases
и используйте
echo "alias $1='$2'" >> $HOME/.bash_aliases
Здесь Вы - исправленный и улучшенный сценарий:
#!/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
к detemine, если псевдоним уже существует.type
к detemine, если команда допустима или нет.elif
.command
может закрыться кавычки (т.е. myscript pingoogle ping google.com
)Вот Ваши ошибки ( источник ):
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