chownがスクリプトを介して機能しない

chownがスクリプトを介して機能しない

スクリプトがあります。

#! /bin/bash
sudo chown -R $USER:$USER /opt/Folder

chownが実行されていないようです。

端末で上記の行を書くと正常に実行されます!

私が読んでこれしかし、それは役に立ちませんでした。

スクリプト名はmysetup.shで実行中です sudo sh mysetup.sh

いかなる出力も提供しません。

このように実行すると、次のような結果がsudo bash -x mysetup.sh得られます。

sudo chown -R root:root /opt/Folder

この質問は関係ありませんこれ、ユーザーが設定したためです。

答え1

/opt/Folderコンテンツを次に変更しようとしています。あなた自身ユーザーIDではありませんか?

これはあなたの命令です:

sudo chown -R $USER:$USER /opt/Folder

$USERコマンドが実行される前に変数が評価されるため、コマンドラインで機能するため、次のように動作します(ユーザー名が仮定されますgeorge)。

sudo chown -R george:george /opt/Folder

一方、runコマンドを使用すると、sudo何よりも変数に$USERターゲットユーザーの値があります(この場合は)root。したがって、実行するとrootとしてsudo bash mysetup.sh実行されるため、mysetup.shコマンドランタイムは次のように$USER設定され評価されます。root

sudo chown -R root:root /opt/Folder

あなたの場合の解決策は、スクリプト全体を実行せずに、必要に応じてスクリプトにsudo高い権限で特定のコマンドを実行させることです。sudoつまり、代わりにbash mysetup.shを使用してくださいsudo bash mysetup.sh

答え2

実行中のLinux(またはUnix)のディストリビューションとバージョンについては言及していないので、ここではトピックから抜け出し、次の行は/etc/sudoers

Defaults requiretty

したがって、ttyがなければsudoを実行することはできません。スクリプトで実行しようとすると、コマンドが実行sudoされず、chownコマンドが効果的に破損します。

sudoコマンドを追加または切り替えてみてください-t-ttこれはコマンドチェーンを実行して成功することができる疑似端末を生成しますが、sudoこのオプションにはここで説明されていない副作用もあります。必要に応じて検索できます。

構成にアクセスできる場合は、sudo上記の行を取り出して最良の解決策を得ることができますが、これにより、いくら弱い障害物であっても、1層の障害物が除去されます。

関連情報