diff options
| author | Teddy Wing | 2017-10-04 23:04:55 +0200 |
|---|---|---|
| committer | Teddy Wing | 2017-10-04 23:04:55 +0200 |
| commit | 607b3d30cbeb6b046b54c3d266b32331212392e8 (patch) | |
| tree | 919d9dece393e87498fa4f28e47c25d45166a35d | |
| parent | c66735aced2373be9902d35c7f45267c8257ba21 (diff) | |
| download | qcd-607b3d30cbeb6b046b54c3d266b32331212392e8.tar.bz2 | |
qcd: Allow database file to be symlinked
The `sed -i` calls in the "change" and "remove" commands will overwrite
a symlinked database file with a real file, destroying the symlink.
To prevent this and allow the database file to be symlinked (to, say,
allow it to be tracked in a dotfiles repo), use a redirection technique
as described here:
https://www.cyberciti.biz/faq/howto-prevent-sed-i-from-destroying-symlinks-on-linux-unix/
Using this alternate method, we preserve symlinks, and even create a
backup file as before.
| -rwxr-xr-x | qcd | 9 |
1 files changed, 7 insertions, 2 deletions
@@ -59,8 +59,12 @@ function __qcd_change_shortcut () { if __qcd_shortcut_exists $shortcut; then path=$(__qcd_absolute_path "$path") + cp $QCD_DATABASE_FILE "${QCD_DATABASE_FILE}.bak" + # The `//\//\/` escapes slashes in the path so that `sed` doesn't complain - sed -i.bak -E "s/^${shortcut} .+$/${shortcut} ${path//\//\\/}/" $QCD_DATABASE_FILE + sed -E "s/^${shortcut} .+$/${shortcut} ${path//\//\\/}/" \ + < "${QCD_DATABASE_FILE}.bak" \ + > $QCD_DATABASE_FILE fi } @@ -68,7 +72,8 @@ function __qcd_remove_shortcut () { local shortcut=$1 if __qcd_shortcut_exists $shortcut; then - sed -i.bak -E "/^${shortcut} .+/d" $QCD_DATABASE_FILE + cp $QCD_DATABASE_FILE "${QCD_DATABASE_FILE}.bak" + sed -E "/^${shortcut} .+/d" < "${QCD_DATABASE_FILE}.bak" > $QCD_DATABASE_FILE fi } |
