3 回答

TA貢獻1982條經驗 獲得超2個贊
您可以使用"${user_defined_directory/#~/$HOME}"
當前用戶的主目錄替換字符串開頭的“?”。請注意,這不會處理~username/subdir
格式,只能處理純格式~
。如果需要處理更復雜的版本,則需要編寫一個更復雜的轉換器。

TA貢獻1866條經驗 獲得超5個贊
在給出一些相當合理的假設的情況下,此方法有效,但它遠非顯而易見的代碼(而且也不是單行代碼):
# Working function - painful, but can you simplify any of it?
# NB: Assumes that ~user does not expand to a name with double spaces or
# tabs or newlines, etc.
expand_tilde()
{
case "$1" in
(\~) echo "$HOME";;
(\~/*) echo "$HOME/${1#\~/}";;
(\~[^/]*/*) local user=$(eval echo ${1%%/*})
echo "$user/${1#*/}";;
(\~[^/]*) eval echo ${1};;
(*) echo "$1";;
esac
}
# Test cases
name1="~/Documents/over enthusiastic"
name2="~crl/Documents/double spaced"
name3="/work/whiffle/two spaces are better than one"
expand_tilde "$name1"
expand_tilde "$name2"
expand_tilde "$name3"
expand_tilde "~"
expand_tilde "~/"
expand_tilde "~crl"
expand_tilde "~crl/"
# This is illustrative of the 'normal use' of expand_tilde function
x=$(expand_tilde "$name1")
echo "x=[$x]"
在我的機器(有一個用戶crl)上運行時,輸出為:
/Users/jleffler/Documents/over enthusiastic
/Users/crl/Documents/double spaced
/work/whiffle/two spaces are better than one
/Users/jleffler
/Users/jleffler/
/Users/crl
/Users/crl/
x=[/Users/jleffler/Documents/over enthusiastic]
該功能分別tilde_expansion處理不同情況。第一個子句處理一個值~并簡單地替換$HOME。第二種情況是偏執狂:~/映射到$HOME/。第三個處理~/anything(包括一個空的“任何東西”)。下一種情況處理~user。包羅萬象*處理其他所有問題。
請注意,該代碼做出了(合理的)假設,即~user不會擴展為包含任何雙精度空格,任何制表符或換行符(以及可能還有其他類似空格的字符)的值。如果您必須解決這個問題,生活將是地獄。
請注意chdir()主目錄的答案,該答案說明POSIX需要~擴展為當前值$HOME,但~user必須從密碼數據庫擴展為主目錄的值。

TA貢獻1817條經驗 獲得超6個贊
提爾德(Tilde)絕對不會在報價內擴展??赡苓€有其他bash技巧,但是在這種情況下,我要做的是:
find ~/"$user_defined_directory" -type f
即,將~/引號外的引號移開,并將其余路徑保留在引號中。
添加回答
舉報