~を含むパスを変数に保存する方法は?

~を含むパスを変数に保存する方法は?

私のスクリプトには次の変数があります。

TARGET=username
TARGET_DIR="~${TARGET}/.ssh"

TARGET_DIRvarでこのパスを維持したいが、代わりに/home/username/.sshを使用します。ただし、スクリプトを実行してユーザー名の下に新しいディレクトリを作成しようとすると、次のメッセージが表示されます。~/home/.ssh

mkdir: cannot create directory ‘~username/.ssh’: No such file or directory

/home/username ディレクトリが存在する場合も同様です。これはうまく TARGET_DIR="/home/${TARGET}/.ssh" いきます。~変数にシンボルを使用する方法は?

ベストアンサー1

bashashおよびチルダ拡張はパラメータ拡張の前に発生するmkshため、yash機能しません。

ここでksh93、または代わりに次を使用するか、zsh次を使用できますeval

user=username # making sure it's a valid username
eval "user_home=~$user"
target_dir=$user_home/.ssh

システムに最近getent一般的なコマンドがある場合は、次のものも使用できます。

user_home=$(getent -- passwd "$user" | cut -d: -f6)

または以下を使用してくださいperl

user_home=$(perl -le 'for (@ARGV) {
  @u = getpwnam$_ or die "No such user: $_\n";
  print $u[7]}' -- "$user")

これは、ユーザー名に珍しい文字(zshのスペースを含むが問題のないユーザーなど)にも当てはまります~$userksh93~"$user"

おすすめ記事