2012-08-13 35 views
1

目標是創建一行(複製並粘貼)bash命令。 bash one line命令應該對驅動器進行分區和格式化,並在該命令產生可安裝的卷時,執行一些初始維護命令。Bash one liner:如何在花括號命令組中嵌入用於列表生成的大括號?

目標是當cd /Volumes/VolumeName在當前shell上下文中成功執行命令列表。這種命令分組可以通過使用大括號在bash中完成。當cd /Volumes/VolumeName失敗(echo $?!= 0)時,不需要進一步的命令執行,並且命令執行可以停止。

命令cd /Volumes/$VOL && {sudo rm -fr .{,_.}{fseventsd,Spotlight-V100,Trashes}; mkdir .fseventsd;}的結果是:

-bash: syntax error near unexpected token `}' 

瓶頸可能是在捲曲的命令之一支撐命令列表是使用大括號爲列表生成:sudo rm -fr .{,_.}{fseventsd,Spotlight-V100,Trashes}

如何在花括號命令組中嵌套用於列表生成的花括號?

回答

4

你只是錯過了一個必要的領先空間。試想一下:

mini:~ michael$ { echo sudo rm -fr .{,_.}{fseventsd,Spotlight-V100,Trashes}; echo mkdir .fseventsd;} 
sudo rm -fr .fseventsd .Spotlight-V100 .Trashes ._.fseventsd ._.Spotlight-V100 ._.Trashes 
mkdir .fseventsd 
mini:~ michael$ {echo sudo rm -fr .{,_.}{fseventsd,Spotlight-V100,Trashes}; echo mkdir .fseventsd;} 
-bash: syntax error near unexpected token `}' 

如果您在man 1 bash複合下命令節你會看到這個(重點煤礦):

{列表; }

列表僅在當前shell環境中執行。列表必須以換行符或分號結尾。這被稱爲組命令。返回狀態是列表的退出狀態。請注意,與元字符(和)不同,{和}是保留字,必須出現在允許識別保留字的位置。 由於它們不會造成分詞,因此必須用空格將其與列表分開。

0

也許問題是嵌套大括號。試試這個:

cd /Volumes/$VOL && (sudo rm -fr .{,_.}{fseventsd,Spotlight-V100,Trashes}; mkdir .fseventsd;) 

如果你想使用子shell,最好的方法是使用「()」而不是「{}」。 使用「()」,您不需要在命令的開始處添加額外的空間。

+0

但他不想使用子shell。這很明顯,因爲他在當前的shell環境中說*。 – kojiro 2012-08-13 12:13:57

+0

你是對的!我沒看過...... – matteomattei 2012-08-13 12:17:25

0

在用於命令分組的大括號周圍添加空格。 { sudo ... insend的{sudo ...

相關問題