Bash
使用別名導出帶空格的路徑環境變數時重定向不明確?
我正在嘗試簡化在 Windows 上
KANBANFILE
使用kanban.bash之間的切換。我正在使用幾個別名,例如以下在
KANBANFILE
s 之間切換:alias k.pos="export KANBANFILE=\"/c/Users/ajleer/OneDrive - Name Of SomeOneDrive/kanbandb/.kanban.pos.csv\""
但是以下行在兩個不同的地方將其中斷,並帶有一個模棱兩可的重定向錯誤,這意味著它試圖從中讀取的文件不存在:
update_item_status(){ item="$( cat "${KANBANFILE}" | awk "{ if (NR==$1) print \$0 }" )" [[ ${#item} == 0 ]] && echo "item $1 not found" && exit 1 if [[ -n "$2" ]]; then # status change status="$(echo "$item" | awk -F',' '{ print $1 }' | sed 's/"//g' )" flags="$(echo "$item" | awk -F',' '{ print $4 }' | sed 's/"//g' )" dates="$(echo "$item" | awk -F',' '{ print $5 }' | sed 's/"//g' )" newflags="$flags${2:0:1}" newdates="$dates $(get_current_date)" [[ "$2" =~ "DONE" ]] && date="$(get_current_date)" newitem="$item" newitem="${newitem/$status/$2}" newitem="${newitem/$flags/$newflags}" newitem="${newitem/$dates/$newdates}" KANBANITEMS="$(<$KANBANFILE)" # THE AMBIGUOUS REDIRECT Error Line echo "${KANBANITEMS//"$item"/"$newitem"}" > "${KANBANFILE}" echo "$status -> $2" fi }
還有這裡:
update_item(){ item="$( cat "${KANBANFILE}" | awk "{ if (NR==$1) print \$0 }" )" [[ ${#item} == 0 ]] && echo "item $1 not found" && exit 1 status="$(echo "$item" | awk -F',' '{ print $1 }')" echo '# # STATUSES ARE: '${statuses[*]}' # '"$item" > "${TMP}".update ${EDITOR} "${TMP}".update KANBANITEMS="$(<$KANBANFILE)" # THE AMBIGUOUS REDIRECT Error Line newitem="$(cat "${TMP}".update | tail -n1 )" echo "${KANBANITEMS//"$item"/"$newitem"}" > "${KANBANFILE}" echo "updated item $1" }
那麼如何重寫我的 KABANFILE 導出別名,以便它不會破壞上面的程式碼,但這樣我仍然可以在指向
.kanban.xxx.csv
文件的路徑中有空格?
Ambigious Redirect
每當我使用kanban <task-id>
orkanban <task-id> <status>
命令時都會發生這種情況(即使這實際上只是使用預設編輯器編輯 csv 文件)。PS 我在 Windows aka MINGW64 上使用 git-bash
命令替換外的引號獨立於其中的引號。
"$KANBANFILE"
所以就像你在其他地方做的那樣引用。$ filename="foo bar" $ echo hello > "$filename" $ echo "$( < $filename )" # $filename is not quoted bash: $filename: ambiguous redirect $ echo "$( < "$filename" )" # "$filename" is quoted hello
也就是說,在作業中,外部引號並不是絕對必要的,因此
var=$(something)
效果也很好var="$(something)"
(排除錯誤)。請參閱,例如在 Bash 中引用 $(command substitution)以及在將其輸出分配給變數時是否需要引用命令替換?