2017-07-03 8 views
0

こんにちは、UNIXのDOCからループを実行することができます。私は自分自身を試してみましたが、うまくいきません。ここからループ命令を実行するDOC

#!/bin/bash 
    path=/global/u70/glob 
    echo abcd | sudo -S -l 
    sudo /usr/bin/su - glob << EOF 
    run(){ 
    for entry in $(ls -r) 
     do 
     echo "$entry" 
     done 
} 
run 
    EOF 
+0

あなたの要件は何ですか?あなたが言うよりも良い方法があると確信しています。 – Inian

+0

@Inianそれは私が実行したときに別のユーザーにsudoを実行すると私はここでDOCから命令を取っていると思う私のローカルパスに保管されているスクリプトを持っている私は実行すると、それ以外の場合は、sudoユーザーではなくローカルパスで動作します。 –

答えて

1

あなたはhere document引用しシングルを使用する必要があります:よくとしての機能を試してみました

#!/bin/bash 
path=/global/u70/glob 
echo abcd | sudo -S -l 
sudo /usr/bin/su - glob << EOF 

for entry in $(ls -r) 
    do 
    echo "$entry" 
    done 
EOF 

sudo /usr/bin/su - glob << 'EOF' 
[…] 
EOF 

そうでなければ、このような$(…)としてシェル置換は、現在で実行されています他のユーザーとは異なります。これは、単一のquoted文字列内の変数や他のシェル置換がどのように展開されないかと同様です。

+0

私はなぜあなたが 'EOF'を使う必要があるのか​​をあなたの言葉でもう少し説明することができますか?私はそれが現在のシェルで実行されない理由を意味します。 –

0

あなたのコードが動作するために$(ls -r)の前にバックスラッシュを追加する必要があると思います。あなたは(2つのEOFの間で)ここに、文書内にあるとき、すべての変数はローカルであり、あなたは、シェル変数から分離され、これらのローカル変数を使用する必要があるため、すなわち

sudo /usr/bin/su - glob << EOF 
for entry in \$(ls -r) 
    do 
    echo "$entry" 
    done 
EOF 

です。しかし、混乱する部分は、heredocの中に$ variableを入れるだけでは、heredocの中で定義された$変数を参照するのではなく、シェルで定義された$変数から参照するということです。 heredoc自身のローカル変数にアクセスするには、$、つまり\ $変数をエスケープする必要があります。

「EOF」とEOFの間のすべてが実際の文字として解釈されるため、「EOF」が機能するかどうかはわかりません。

関連する問題