-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathset_alias.sh
56 lines (48 loc) · 1.74 KB
/
set_alias.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
## 用来给.bashrc 或者其他的添加alias用。会先备份$2文件为 backup.$2
# 用法: ./setalias.sh 源文件 目标文件
# 源文件有 目标文件有,则在目标文件对应行开头加注释符号
# 源文件有 目标文件无,复制过去。
# 源文件无 目标文件有,保留行。
# 2023年3月9日
#!/bin/bash
set_alias() {
alias_from="$1"
alias_to="$2"
backup="$alias_to"
# 检查 $alias_from 文件是否存在
if [[ ! -f "$alias_from" ]]; then
echo "Error: $alias_from does not exist."
return 1
fi
# 检查 $alias_to 文件是否存在或有写权限
if [[ ! -f "$alias_to" && ! -w "$(dirname "$alias_to")" ]]; then
echo "Error: $alias_to does not exist and $(dirname "$alias_to") is not writable."
return 1
fi
if [[ -f "$alias_to" ]]; then
i=1
while [[ -f "backup$i.$alias_to" ]]; do
((i++))
done
backup="backup$i.$alias_to"
fi
cp "$alias_to" "$backup" 2>/dev/null
while IFS= read -r line; do
alias_name=$(echo "$line" | sed 's/^alias \([^=]*\)=.*$/\1/')
if [[ -n "$alias_name" ]]; then
if grep -q "^alias $alias_name=" "$alias_to"; then
sed -i "s/^alias $alias_name=/#alias $alias_name=/" "$alias_to"
fi
if ! grep -q "^alias $alias_name=" "$alias_to"; then
echo "$line" >> "$alias_to"
fi
fi
done < "$alias_from"
while IFS= read -r line; do
alias_name=$(echo "$line" | sed 's/^alias \([^=]*\)=.*$/\1/')
if [[ -n "$alias_name" && ! $(grep -q "^alias $alias_name=" "$alias_from") ]]; then
echo "$line" >> "$alias_from"
fi
done < "$alias_to"
}
set_alias "$1" "$2"