単純なbashプログラムがありますが、ファイル構造は次のとおりです。
$ツリー
.
├── includes
│ └── vimrc.vim
└── test_sourcing_vimrc.sh
。
file: test_sourcing_vimrc.sh
#! /bin/bash
self_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
sudo -s -u lando cat includes/vimrc.vim > test_output
。
file: includes/vimrc.vim (contains a .vimrc content)
" vim settings
set number
set laststatus=2
syntax enable
私の意図は
スクリプトをrootとして実行します(スクリプトには他の理由でこれらの権限が必要です)。
sudo ./test_sourcing_vimrc.sh
sudo
root以外のユーザーに「lando」を提供 - すでに存在します。cat
コンテンツincludes/vimrc.vim
を新しいファイルにtest_output
test_output
「lando」が所有する必要がありますが、ルートが所有します。
-rw-r--r-- 1 root root 5620 Sep 24 19:00 test_output
ルートではなく、正しいユーザーが所有するファイルを生成するためにこのスクリプトをどのように取得できますか?
答え1
別の解決策は次のとおりです。
sudo install -o lando -m0775 -p -S includes/vimrc.vm test_output
コピーしたファイルが受信する権限を設定します-m0775
。これらの権限は実際にはデフォルト値なので、必要に応じて省略できます。-p
コピーしたファイルの変更時間を元のファイルと同じにします。これ-S
により、すでに存在する場合は、ソースファイルが正常にコピーされないtest_output
限り削除されません。install
必要に応じて、これらの作業は必要ない場合があります。とにかく、この問題に直面し、他の要件がある他の人のためにこれを指摘します。
最後に含まれているスクリプトはすでにrootとして実行されているので、最初のsudo
.
答え2
解決済み
変更
sudo -s -u lando cat includes/vimrc.vim > test_output
到着
sudo -s -u lando <<EOF
cat includes/vimrc.vim > test_output
EOF