我需要運行一個系統命令,它將轉到一個目錄並刪除不包含文件的子目錄(如果存在)。我寫了下面的命令來執行這個操作:perl中的系統命令
system("cd /home/faizan/test/cache ; for i in *\; do if [ -d \"$i\" ]\; then echo \$i fi done");
上面的命令一直拋出語法錯誤。我嘗試了多種組合,但仍不清楚應該如何去做。請建議。
我需要運行一個系統命令,它將轉到一個目錄並刪除不包含文件的子目錄(如果存在)。我寫了下面的命令來執行這個操作:perl中的系統命令
system("cd /home/faizan/test/cache ; for i in *\; do if [ -d \"$i\" ]\; then echo \$i fi done");
上面的命令一直拋出語法錯誤。我嘗試了多種組合,但仍不清楚應該如何去做。請建議。
那麼,你的命令行確實包含語法錯誤。試試這個:
system("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done");
或者更好的是,只在第一個地方循環目錄;
system("for i in /home/faizan/test/cache/*/.; do echo \$i; done");
或者更好的是,這樣做沒有環:
system("echo /home/faizan/test/cache/*/.");
(我想你會想rmdir
而不是echo
一旦正確調試)
或者更好的是,用Perl做這一切。這裏沒有什麼需要system()
。
謝謝你..你的建議工作..我會嘗試在perl –
由於問題的標題代表system
命令,這將直接回答,而是使用bash樣本命令只包含將在Perl被simplier只(以使用opendir
和-d
在Perl看看其他的答案)的事情。
如果你想使用(而不是open $cmdHandle,"bash -c ... |"
)system
,要執行的首選語法命令,如system
或exec
,就是讓perl
解析命令行。
試試這個(因爲你已經做了):
perl -e 'system("bash -c \"echo hello world\"")'
hello world
perl -e 'system "bash -c \"echo hello world\"";'
hello world
現在更好,同樣而是讓perl
確保在命令行解析,試試這個:
perl -e 'system "bash","-c","echo hello world";'
hello world
顯然有3爭論system
命令的:
或更多一點:
perl -e 'system "bash","-c","echo hello world;date +\"Now it is %T\";";'
hello world
Now it is 11:43:44
,你可以在最後的目的看,有沒有雙雙引號包圍命令bash腳本部分線。
**注意:在命令行上,使用perl -e '...'
或perl -e "..."
,使用引號和雙引號會有點沉重。在腳本中,你可以將它們混合:
system 'bash','-c','for ((i=10;i--;));do printf "Number: %2d\n" $i;done';
甚至:
system 'bash','-c','for ((i=10;i--;));do'."\n".
'printf "Number: %2d\n" $i'."\n".
'done';
使用點.
爲concatening(腳本部分)字符串的一部分,總有3個參數。
你還是最好先把它作爲bash命令。格式化,妥善使得它更加清晰,你缺失的語句結束:
for i in *; do
if [ -d "$i" ]; then
echo $i
fi
done
和冷凝,通過(從do
/then
後開),用分號替換新行:
for i in *; do if [ -d "$i" ]; then echo $i; fi; done
或者爲有已經提到,只是在Perl中做的(我沒有測試過這個實際上取消註釋remove_tree - 要小心!):
use strict;
use warnings;
use File::Path 'remove_tree';
use feature 'say';
chdir '/tmp';
opendir my $cache, '.';
while (my $item = readdir($cache)) {
if ($item !~ /^\.\.?$/ && -d $item) {
say "Deleting '$item'...";
# remove_tree($item);
}
}
實施這個謝謝你的好解釋。問題是隻有一臺服務器安裝了perl,而其他服務器不需要在這裏執行。我需要ssh到那些使用Perl的服務器,然後執行一個sh腳本或類似於上面的東西。 –
使用系統
my @args = ("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done");
system(@args);
使用子程序
sub do_stuff {
my @args = ("bash", "-c", shift);
system(@args);
}
do_stuff("cd /home/faizan/test/cache ; for i in *; do if [ -d \"\$i\" ]; then echo \$i; fi; done");
sub真的很酷..謝謝 –
有什麼錯誤? –
錯誤:sh:-c:第1行:語法錯誤:文件意外結束 –
爲什麼不單獨創建一個bash文件,然後從Perl程序中調用它? –