В течение некоторого времени у меня есть две функции pathadd
и pathrm
, которые помогают добавлять элементы в путь, не беспокоясь о дублировании.
pathadd
принимает единственный аргумент пути и необязательный после аргумента
, который, если он указан, будет добавлен к PATH
, в противном случае он добавит его в начало.
Практически в каждой ситуации, если вы добавляете в путь, вы, вероятно, захотите переопределить все, что уже есть в пути, поэтому я предпочитаю добавлять по умолчанию.
pathadd() {
newelement=${1%/}
if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then
if [ "$2" = "after" ] ; then
PATH="$PATH:$newelement"
else
PATH="$newelement:$PATH"
fi
fi
}
pathrm() {
PATH="$(echo $PATH | sed -e "s;\(^\|:\)${1%/}\(:\|\$\);\1\2;g" -e 's;^:\|:$;;g' -e 's;::;:;g')"
}
Поместите их в любой сценарий, который вы хотите изменить среду PATH, и теперь вы можете это сделать.
pathadd "/foo/bar"
pathadd "/baz/bat" after
export PATH
Вы гарантированно не добавите к пути, если он уже есть. Если теперь вы хотите убедиться, что / baz / bat
находится в начале.
pathrm "/baz/bat"
pathadd "/baz/bat"
export PATH
Теперь любой путь можно переместить на передний план, если он уже находится на пути, без дублирования.
Некоторые подсказки:
eval
для интерпретации переменной. find
, а используйте find -exec
. bash
вместо cut
. rsync
вместо cp
. find backup -type f -exec sh -c '
mkdir -p "$(eval dirname "${1#*/}")";
rsync -av "$1" "$(eval printf "${1#*/}")"
' find-sh {} \;
Или лучше просто используйте rsync
в первую очередь, что делает именно то, что вы хотите:
rsync -av backup/\$HOME/ $HOME/