tag:blogger.com,1999:blog-27790137797898912972024-03-19T01:48:25.314-07:00Steven's Dev BlogTips to remind for the FUTURE.Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.comBlogger141125tag:blogger.com,1999:blog-2779013779789891297.post-80922643889113959292016-07-20T22:08:00.001-07:002016-07-20T22:16:54.754-07:00Postgres on BtrfsPostgres performs random writes on big database files, which can cause huge performance impact on files systems featured with COW(Copy On Write) like btrfs and zfs.<br />
<br />
A good practice is add "nodatacow" option to database volume in /etc/fstab<br />
<br />
Run <br />
<pre>mount <mount-point> -o remount</pre>
to apply the edited mount options.<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-84645938703930783702015-02-02T04:41:00.002-08:002015-02-02T04:41:41.945-08:00Ram disk on OS X<div>
Create a 1.5G ram disk at /Volumes/ramdisk</div>
<div>
<br /></div>
$ diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://3145728`<br />
<br />
http://apple.stackexchange.com/questions/55794/why-do-mac-os-x-ramdisks-appear-to-be-limited-to-550mb-and-how-can-i-change-this<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-38473097044514471212014-09-01T23:46:00.000-07:002014-09-01T23:46:08.010-07:00Find the original user of a process invoked by sudo Let's say you want to find out who kicked off the most memory consuming process using root.<br />
<br />
1) open top.<br />
2) sort by mem by pressing ><br />
3) write down the pid<br />
4) sudo vim /proc/<pid>/environ , you will find the the user in: SUDO_USER='\<user\>'<br />
<br />
There are some other ways: <a href="http://unix.stackexchange.com/questions/7334/using-top-to-see-processes-run-by-a-user-on-behalf-of-sudo">http://unix.stackexchange.com/questions/7334/using-top-to-see-processes-run-by-a-user-on-behalf-of-sudo</a><div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-35560019830729097482014-08-07T22:42:00.002-07:002014-08-07T22:42:45.599-07:00Join odd and even numbered linessed:<br />
<br />
sed '$!N;s/\n/,/'<br />
<br />
<br />
awk:<br />
<br />
awk 'NR%2==0 {print p","$0;} NR%2 {p=$0;}'<br />
<br />
<br />
paste:<br />
<br />
paste - -<br />
<br />
<br />
--------------------------<br />
Seems I like paste most. To join 3 consecutive lines:<br />
<br />
paste - - -<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-87352893884267708032014-07-18T19:25:00.000-07:002014-10-07T03:32:15.618-07:00Python Profilerdef do_cprofile(func):<br />
def profiled_func(*args, **kwargs):<br />
import cProfile<br />
profile = cProfile.Profile()<br />
try:<br />
profile.enable()<br />
result = func(*args, **kwargs)<br />
profile.disable()<br />
return result<br />
finally:<br />
profile.print_stats(sort=1)<br />
return profiled_func<br />
<br />
try:<br />
from line_profiler import LineProfiler<br />
<br />
def do_profile(follow=[]):<br />
def inner(func):<br />
def profiled_func(*args, **kwargs):<br />
try:<br />
profiler = LineProfiler()<br />
profiler.add_function(func)<br />
for f in follow:<br />
profiler.add_function(f)<br />
profiler.enable_by_count()<br />
return func(*args, **kwargs)<br />
finally:<br />
profiler.print_stats()<br />
return profiled_func<br />
return inner<br />
<br />
except ImportError:<br />
def do_profile(follow=[]):<br />
"Helpful if you accidentally leave in production!"<br />
def inner(func):<br />
def nothing(*args, **kwargs):<br />
return func(*args, **kwargs)<br />
return nothing<br />
return inner<br />
<br />
<br />
@do_profile(follow=[fun2])<br />
def fun1():<br />
fun2()<br />
pass<br />
<br />
<br />
@do_cprofile()<br />
def fun2()<br />
pass<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-83622956086462575092014-07-07T22:54:00.000-07:002014-07-07T22:54:01.807-07:00Java cpu profiling with hprofSet JAVA_OPTS:<br />
<br />
<pre style="-webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-family: ConfluenceInstalledFont, monospace; font-size: 14.44444465637207px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 1.3; margin: 0px; orphans: auto; padding: 0px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">-Xrunhprof:cpu=samples,interval=10,depth=8</pre>
<pre style="-webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-family: ConfluenceInstalledFont, monospace; font-size: 14.44444465637207px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 1.3; margin: 0px; orphans: auto; padding: 0px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"> </pre>
<pre style="-webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-family: ConfluenceInstalledFont, monospace; font-size: 14.44444465637207px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 1.3; margin: 0px; orphans: auto; padding: 0px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;"> </pre>
<pre style="-webkit-text-stroke-width: 0px; background-color: white; color: #333333; font-family: ConfluenceInstalledFont, monospace; font-size: 14.44444465637207px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 1.3; margin: 0px; orphans: auto; padding: 0px; text-align: start; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px;">There will be a file called "java.hprof.txt" in your working directory </pre>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-76413001140252121272013-09-05T20:26:00.001-07:002013-09-05T20:26:05.202-07:00No syntax highlighting in vimdiffVim Syntax highlight often mixed with diff color, which makes text unreadable.<br />
<div>
<br /></div>
<div>
Add following line in ~/.vimrc to turn off syntax off in vimdiff</div>
<div>
<br /></div>
<div>
<code>
if &diff | syntax off | endif
</code>
</div>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com4tag:blogger.com,1999:blog-2779013779789891297.post-5445005340498154072013-08-28T23:25:00.002-07:002013-08-28T23:25:55.914-07:00IO Redirection - Swapping stdout and stderr (Advanced)<pre class="lang-sh prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">%</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">sh myscript</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">sh </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">3</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">>&</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">2</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">2</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">>&</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">>&</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">3</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">2</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">>/</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">dev</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">null
I</span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">'m stderr
% (sh myscript.sh 3>&2 2>&1 1>&3) >/dev/null
I'</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">m stdout</span></code></pre>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-15082842544385003252013-08-08T19:35:00.002-07:002013-08-08T19:35:33.114-07:00python 3 line to solve 8 queenfrom itertools import *<br />
c = range(8)<br />
print len([v for v in permutations(c) if 8==len(set(v[i]+i for i in c))==len(set(v[i]-i for i in c))])<br />
<div>
<br /></div>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-79062603772153093842013-06-25T19:40:00.000-07:002013-06-25T19:41:29.027-07:00Python overwrite printed line, e.g. text progress<pre class="default prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">\r will reset the cursor to the beginning of the line.</span></code></pre>
<pre class="default prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">>>></span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">for</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> i </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">in</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> range</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">100</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">):</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> time</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">sleep</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> sys</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">stdout</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">write</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"\r%d%%"</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">%</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">i</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="com" style="background-color: transparent; border: 0px; color: grey; margin: 0px; padding: 0px; vertical-align: baseline;"># or print >> sys.stdout, "\r%d%%" %i,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> sys</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">stdout</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">flush</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">()</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">...</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span></code></pre>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-45183545648945464162013-05-07T21:54:00.001-07:002013-05-07T21:54:06.406-07:00Benchmark CPU in SHELL$ time echo "scale=5000; a(1)*4" | <span class="GINGER_SOFATWARE_spelling" ginger_sofatware_uiphraseguid="530a8cf5-b6c6-48ca-b5f5-fd685af398b1">bc</span> -l<br /><div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-85193006868500436852013-03-07T18:33:00.001-08:002013-03-07T18:33:56.354-08:00brackets, parentheses, curly braces in BASH<br />
<div class="post-text" style="background-color: white; border: 0px; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px; margin: 0px 5px 5px 0px; padding: 0px; vertical-align: baseline; width: 660px;">
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
In Bash, <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">test</code> and <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">[</code> are <span class="GRcorrect" grcontextid="builtins:0" grmarkguid="474fb608-68fd-43be-98f8-ff721ec21034" gruiphraseguid="51392786-df1d-4219-ac0f-4eddbd06c276">builtins</span>.</div>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
The <a href="http://mywiki.wooledge.org/BashFAQ/031" style="background-color: transparent; border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;">double bracket</a> enables additional functionality. For example, you can use <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">&&</code> and <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">||</code> instead of<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">-a</code> and <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">-o</code> and there's a regular expression matching operator <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">=~</code>.</div>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
The braces, in addition to delimiting a variable name are used for <a href="http://tiswww.case.edu/php/chet/bash/bashref.html#SEC31" style="background-color: transparent; border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;">parameter expansion</a> so you can do things like:</div>
<ul style="background-color: transparent; border: 0px; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1em 30px; padding: 0px; vertical-align: baseline;">
<li style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;"><div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
Truncate the contents of a variable</div>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">$ var="abcde"; echo $<span class="GRcorrect" grcontextid="{:0" grmarkguid="bcaac214-1895-4c91-959f-4c60e01d18e7" gruiphraseguid="560d9167-08b8-41d5-a232-8ad7114e0981">{</span>var%d*}</code><br />
<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;"><span class="GRcorrect" grcontextid="abc:0" grmarkguid="98967acd-5cba-4b95-afd2-ed1c80914372" gruiphraseguid="eb056505-f221-44ac-998f-733d5c52cde7">abc</span></code></div>
</li>
<li style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;"><div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
Make substitutions similar to <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;"><span class="GRcorrect" grcontextid="sed:0" grmarkguid="4a734d03-7915-4980-9ebe-f8a4bc48d288" gruiphraseguid="b506a886-a1f7-4b99-b9a3-9e6116da65f9">sed</span></code></div>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">$ var="abcde"; echo $<span class="GRcorrect" grcontextid="{:0" grmarkguid="e0bc16e4-a4b8-40e5-9ab6-d33285800f79" gruiphraseguid="536db46e-c298-40c7-b32a-f0439e3efad9">{</span><span class="GRnoSuggestion GRcorrect" grcontextid="var:1" grmarkguid="26d4a236-4129-4e49-bfef-37f17d42f914" gruiphraseguid="536db46e-c298-40c7-b32a-f0439e3efad9">var</span>/<span class="GRnoSuggestion GRcorrect" grcontextid="de:2" grmarkguid="c1915c55-eb8b-4f6f-b8f4-de2a2621002d" gruiphraseguid="536db46e-c298-40c7-b32a-f0439e3efad9">de</span>/12}</code><br />
<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">abc12</code></div>
</li>
<li style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;"><div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
Use a default value</div>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">$ default="hello"; <span class="GRcorrect" grcontextid="unset:0" grmarkguid="a7767dad-7dc1-4b34-accd-61a7c5a21104" gruiphraseguid="4c5f064e-e0eb-42d0-b3b3-87210ef69d8f">unset</span> <span class="GRnoSuggestion GRcorrect" grcontextid="var:1" grmarkguid="4a5a2473-95b5-4679-be47-725b2595ff66" gruiphraseguid="4c5f064e-e0eb-42d0-b3b3-87210ef69d8f">var</span>; echo $<span class="GRcorrect" grcontextid="{:2" grmarkguid="917756bd-00e2-4f6c-a972-b88149667daa" gruiphraseguid="4c5f064e-e0eb-42d0-b3b3-87210ef69d8f">{</span><span class="GRnoSuggestion GRcorrect" grcontextid="var:3" grmarkguid="ce97ae7c-4024-4d9c-90c0-6eadeb51b20e" gruiphraseguid="4c5f064e-e0eb-42d0-b3b3-87210ef69d8f">var</span>:-$default}</code><br />
<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">hello</code></div>
</li>
<li style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;"><div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
and several more</div>
</li>
</ul>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
</div>
<a name='more'></a>Double parentheses are used for <a href="http://tiswww.case.edu/php/chet/bash/bashref.html#SEC33" style="background-color: transparent; border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;">arithmetic operations</a>:<br />
<pre class="lang-bsh prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">((</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">a</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">++))</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">((</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">meaning </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">42</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">))</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">for</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">((</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">i</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">0</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> i</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">10</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> i</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">++))</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
echo $</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">((</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">a </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> b </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">+</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">14</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">*</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> c</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">)))</span></code></pre>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
and they enable you to omit the dollar signs on integer and array variables and include spaces around operators for readability.</div>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
Single brackets are also used for <a href="http://tiswww.case.edu/php/chet/bash/bashref.html#SEC85" style="background-color: transparent; border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;">array</a> indices:</div>
<pre class="lang-bsh prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">array</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">[</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">4</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">]=</span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">"hello"</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
element</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">$</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">array</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">[</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">index</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">]}</span></code></pre>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
Curly brace are required for (most/all?) array references on the right hand side.</div>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
parentheses are also used for subshells. And that they are used to create arrays.</div>
<pre class="lang-bsh prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">array</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=(</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">2</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">3</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
echo $</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">array</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">[</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">]}</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">2</span></code></pre>
<div>
<code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;"><br /></span></code></div>
<div>
<code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;"><br /></span></code></div>
<div>
<code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;"></span></code><br />
<ol style="border: 0px; color: black; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; list-style-image: initial; list-style-position: initial; margin: 0px 0px 1em 30px; padding: 0px; vertical-align: baseline;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">
<li style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;"><div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
A single bracket (<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">[</code>) usually actually calls a program named <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">[</code>; <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">man test</code> or <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">man [</code> for more info. Example:</div>
<pre class="lang-bsh prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">$ VARIABLE</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">abcdef
$ </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">[</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $VARIABLE </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">==</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> abcdef </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">]</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">then</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> echo yes </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">else</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> echo no </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">fi</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
yes</span></code></pre>
</li>
<li style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;"><div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
The double bracket (<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">[[</code>) does the same thing (basically) as a single bracket, but is a bash builtin.</div>
<pre class="lang-bsh prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">$ VARIABLE</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">abcdef
$ </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">if</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">[[</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $VARIABLE </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">==</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">123456</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">]]</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">then</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> echo yes </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">else</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> echo no </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">fi</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
no</span></code></pre>
</li>
<li style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; word-wrap: break-word;"><div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
Parentheses (<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">()</code>) are used to create a subshell. For example:</div>
<pre class="lang-bsh prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">$ pwd
</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">home</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">user
$ </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">cd </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">tmp</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> pwd</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">tmp
$ pwd
</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">home</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">user</span></code></pre>
<div style="background-color: transparent; border: 0px; clear: both; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
As you can see, the subshell allowed you to perform operations without affecting the environment of the current shell.</div>
</li>
</span></code></ol>
<code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">
<div style="border: 0px; clear: both; color: black; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
4a. Braces (<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">{}</code>) are used to unambiguously identify variables. Example:</div>
<pre class="lang-bsh prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; color: black; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $ VARIABLE</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">abcdef
$ echo </span><span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;">Variable</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $VARIABLE
</span><span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;">Variable</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> abcdef
$ echo </span><span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;">Variable</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $VARIABLE123456
</span><span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;">Variable</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$ echo </span><span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;">Variable</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">VARIABLE</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">}</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">123456</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;">Variable</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">:</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> abcdef123456</span></code></pre>
<div style="border: 0px; clear: both; color: black; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
4b. Braces are also used to execute a sequence of commands in the <em style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">current</em> shell context, e.g.</div>
<pre class="lang-bsh prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; color: black; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> $ </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> date</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> top </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">b </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">-</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">n1 </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">|</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> head </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">></span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">logfile
</span><span class="com" style="background-color: transparent; border: 0px; color: grey; margin: 0px; padding: 0px; vertical-align: baseline;"># 'date' and 'top' output are concatenated, </span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
</span><span class="com" style="background-color: transparent; border: 0px; color: grey; margin: 0px; padding: 0px; vertical-align: baseline;"># could be useful sometimes to hunt for a top loader )</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
$ </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">{</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> date</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> make </span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">2</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">>&</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> date</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">;</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">}</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">|</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> tee logfile
</span><span class="com" style="background-color: transparent; border: 0px; color: grey; margin: 0px; padding: 0px; vertical-align: baseline;"># now we can calculate the duration of a build from the logfile</span></code></pre>
<div style="border: 0px; clear: both; color: black; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
There is a subtle syntactic difference with <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">( )</code>, though (see <a href="http://www.gnu.org/software/bash/manual/bashref.html#Command-Grouping" style="background-color: transparent; border: 0px; color: #4a6b82; cursor: pointer; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;">bash reference</a>) ; essentially, a semicolon<code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">;</code> after the last command within braces is a must, and the braces <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">{</code>, <code style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 1px 5px; vertical-align: baseline;">}</code> <strong style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">must</strong> be surrounded by spaces.<br />
<br />
From: <a href="http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces" style="background-color: transparent;">http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces</a></div>
</span></code></div>
</div>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com9tag:blogger.com,1999:blog-2779013779789891297.post-68628994756251306062013-03-06T16:17:00.002-08:002013-03-06T16:17:58.458-08:00Vim folding, auto fold xml, fold, unfold<br />
<div style="background-color: white; border: 0px; clear: both; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px; margin-bottom: 1em; padding: 0px; vertical-align: baseline; word-wrap: break-word;">
To allow folds based on <span class="GRcorrect" grcontextid="syntax add:0" grmarkguid="13ef7578-8f5b-4fa4-814e-a8400e50eada" gruiphraseguid="182a17af-cb5e-4fb7-83d6-d9b4523bbf02">syntax add</span> something like the following to your .<span class="GRcorrect" grcontextid="vimrc:1" grmarkguid="8a0f17cf-2a9d-41f9-b1b9-93bea9609033" gruiphraseguid="182a17af-cb5e-4fb7-83d6-d9b4523bbf02">vimrc</span>:</div>
<pre class="lang-perl prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="GRcorrect" grcontextid="set:0" grmarkguid="636ed20c-1e12-4bfa-91e8-61fa03806985" gruiphraseguid="9d8ac0ad-a205-4f7d-b4e8-cd71b7cc78ed">set</span> foldmethod</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">syntax
<span class="GRcorrect" grcontextid="set:0" grmarkguid="ef2e3bad-906f-4b71-a040-a985a9792edf" gruiphraseguid="031cb759-57b9-4207-8f57-7f04bc25eb6b">set</span> foldlevelstart</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
<span class="GRcorrect" grcontextid="let:0" grmarkguid="6a2c2347-0a9a-48ed-bc17-0375e7d25d2a" gruiphraseguid="75225f2b-6b5c-4937-a14c-5272fb4dc9bc">let</span> javaScript_fold</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">" JavaScript
<span class="GRcorrect" grcontextid="let:0" grmarkguid="32c3d8d7-6164-4c7a-b3d6-7b5a4a28b0ab" gruiphraseguid="a107ba93-5aa7-45c2-996d-36559e311774">let</span> perl_fold=1 "</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;">Perl</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
<span class="GRcorrect" grcontextid="let:0" grmarkguid="d6af885b-7aea-455e-b7cc-d6b6a021f077" gruiphraseguid="77f3eb30-eacb-4808-a62f-301b44895338">let</span> php_folding</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">" PHP
<span class="GRcorrect" grcontextid="let:0" grmarkguid="ce33a983-bcc8-4fcc-8209-2c6c4d1b6c94" gruiphraseguid="b09de4a2-9039-411c-95df-2c28bbe29139">let</span> r_syntax_folding=1 "</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> R
<span class="GRcorrect" grcontextid="let:0" grmarkguid="96a85154-87b7-4b32-9628-00380d090e08" gruiphraseguid="d8e095a0-7c1c-49f5-a249-fe3c1ed7f6af">let</span> ruby_fold</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">1</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">" Ruby
<span class="GRcorrect" grcontextid="let:0" grmarkguid="4bb68bda-4688-48d2-841f-c34cca6eea28" gruiphraseguid="8ddca0d3-3024-4676-8283-11021a4f5d1c">let</span> sh_fold_enabled=1 "</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> <span class="goog_qs-tidbit goog_qs-tidbit-0" style="background-color: #ffffdd; border: 0px; display: inline !important; margin: 0px; padding: 0px; text-decoration: inherit; vertical-align: baseline;">sh
<span class="GRcorrect" grcontextid="let:0" grmarkguid="8a7a5ca7-1421-4687-b4c8-73536273e302" gruiphraseguid="96346e78-b811-43ea-8a65-fd58332e2da1">let</span> vimsyn_folding</span></span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="goog_qs-tidbit goog_qs-tidbit-0" style="background-color: #ffffdd; border: 0px; display: inline !important; margin: 0px; padding: 0px; text-decoration: inherit; vertical-align: baseline;">=</span></span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="goog_qs-tidbit goog_qs-tidbit-0" style="background-color: #ffffdd; border: 0px; color: black; display: inline !important; margin: 0px; padding: 0px; text-decoration: inherit; vertical-align: baseline;">'af'</span></span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="str" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="goog_qs-tidbit goog_qs-tidbit-0" style="background-color: #ffffdd; border: 0px; color: black; display: inline !important; margin: 0px; padding: 0px; text-decoration: inherit; vertical-align: baseline;">" Vim script
<span class="GRcorrect" grcontextid="let:0" grmarkguid="badb5944-604f-4057-9153-a1348bd6763d" gruiphraseguid="ac045782-4091-4f17-801d-97d0cc0e651d">let</span> xml_syntax_folding=1 "</span></span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="goog_qs-tidbit goog_qs-tidbit-0" style="background-color: #ffffdd; border: 0px; display: inline !important; margin: 0px; padding: 0px; text-decoration: inherit; vertical-align: baseline;"> XML</span></span></code></pre>
<div>
<code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="goog_qs-tidbit goog_qs-tidbit-0" style="background-color: #ffffdd; border: 0px; display: inline !important; margin: 0px; padding: 0px; text-decoration: inherit; vertical-align: baseline;"><br /></span></span></code></div>
<div>
<span style="font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;"><span class="GRcorrect" grcontextid="zo:0" grmarkguid="4fdc2bef-7f69-44cc-9fbe-4cc5003199c2" gruiphraseguid="d08e5c7a-bbde-474a-867c-f50b611d3582">zo</span> -- To open a fold block</span></div>
<div>
<span style="font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;"><span class="GRcorrect" grcontextid="zc:0" grmarkguid="238365dd-8191-4f96-9bbf-723e5a1163e0" gruiphraseguid="9d7d1e95-fd84-421d-923a-81fdebe03b8e">zc</span> -- To fold a block</span></div>
<div>
<span style="font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;"><span class="GRcorrect" grcontextid="zr:0" grmarkguid="362ad4c7-e97d-4eef-92f4-5a5eb76cf7d1" gruiphraseguid="fffa17e5-59ce-422b-b481-a88350252068">zr</span> -- Fold less</span></div>
<div>
<span style="font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;"><span class="GRspelling" gruiphraseguid="ff4fb422-6a0f-470d-bc9f-533892cee341">zm</span> -- Fold more</span></div>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com7tag:blogger.com,1999:blog-2779013779789891297.post-907087929006385312013-02-17T21:50:00.003-08:002013-02-17T21:50:28.384-08:00Python multiple thread processing <br />
<pre class="default prettyprint prettyprinted" style="background-color: #eeeeee; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; line-height: 18px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto;"><code style="border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; margin: 0px; padding: 0px; vertical-align: baseline;"><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">from</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> multiprocessing </span><span class="kwd" style="background-color: transparent; border: 0px; color: darkblue; margin: 0px; padding: 0px; vertical-align: baseline;">import</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;">Pool</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
pool </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-color: transparent; border: 0px; color: #2b91af; margin: 0px; padding: 0px; vertical-align: baseline;">Pool</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">processes</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="lit" style="background-color: transparent; border: 0px; color: maroon; margin: 0px; padding: 0px; vertical-align: baseline;">5</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">
pages </span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">=</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> pool</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">map</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">visit</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">,</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;"> get_lines</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">file</span><span class="pun" style="background-color: transparent; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">))</span></code></pre>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-19040706682995855462013-02-14T21:55:00.001-08:002013-02-14T21:55:31.155-08:00What every programmer should know…<br />
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
<a href="http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html" rel="nofollow" style="color: #1155cc;" target="_blank"><span class="GingerNoCheckStart"></span>What Every Computer Scientist Should Know About Floating-Point Arithmetic</a></div>
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
<a href="http://www.akkadia.org/drepper/cpumemory.pdf" rel="nofollow" style="color: #1155cc;" target="_blank">What Every Programmer Should Know About Memory</a></div>
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
<a href="http://kunststube.net/encoding/" style="color: #1155cc;" target="_blank">What every programmer absolutely, positively needs to know about encodings and character sets to work with text</a></div>
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
<a href="http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html" style="color: #1155cc;" target="_blank">Latency Numbers Every Programmer Should Know</a></div>
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
<a href="http://unix4lyfe.org/time/?v=1" style="color: #1155cc;" target="_blank">What every programmer should know about time</a></div>
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
<a href="https://code.google.com/p/thread-sanitizer/wiki/AboutRaces" style="color: #1155cc;" target="_blank">What Every Programmer Should Know About Races</a></div>
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
<a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html" style="color: #1155cc;" target="_blank">What Every C Programmer Should Know About Undefined Behavior</a></div>
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
<a href="http://www.slideshare.net/iammutex/what-every-data-programmer-needs-to-know-about-disks" style="color: #1155cc;" target="_blank">What every data programmer needs to know about disks</a></div>
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
<br /></div>
<div style="background-color: white; font-family: arial, sans-serif; font-size: 13px;">
Above contents are from <a href="http://wangcong.org/blog/archives/2255" style="background-color: transparent;">http://wangcong.org/blog/archives/2255</a></div>
<br />
<span class="GingerNoCheckEnd"></span><div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-82719120293187123652013-02-12T22:10:00.001-08:002013-02-12T22:10:38.229-08:00List recently modified files under a directory in linux shellIn order to list files that have been modified recently, we could use the find command to retrieve the file information and sort them by modified date:
<br /><br />
<code>
find . -type f -exec stat --format '%Y :%y %n' {} \; | sort -nr | cut -d: -f2- | head
</code>
<br /><br />
However, this will miss some folders if the folders are symoblic links. So in this case we could specify find to follow symbolic links.
<br /><br />
<code>
find -L . -type f -exec stat --format '%Y :%y %n' {} \; | sort -nr | cut -d: -f2- | head
</code>
<br /><br />
Fourther more, if you just want to get files modified in last a few days, it's build in in find:
<br /><br />
<code>
find . -mtime n
</code>
<br /><br />
list files that modified n*24 hours ago.<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-45643834935208483442013-02-04T16:45:00.002-08:002013-02-04T16:45:21.606-08:00The difference between soft link and hard link in linuxFrom: <a href="http://linuxgazette.net/105/pitcher.html">http://linuxgazette.net/105/pitcher.html</a><br />
<br />
<br />
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
Unix files consist of two parts: the data <span class="GRcorrect" grcontextid="part:0" grmarkguid="c80c7df1-185f-4118-adc3-fe199ef49ba5" gruiphraseguid="0536e9e7-c51f-4eec-8b42-51d599bb3677">part</span> and the filename part.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
The data part is associated with something called an 'inode'. The inode carries the map of where the data is, the file permissions, etc. <span class="GRcorrect" grcontextid="for:0" grmarkguid="0b7bf19e-fc6e-4722-bd1e-b25f04f0d3a2" gruiphraseguid="bd214fc2-1b1f-4ace-a06a-3c82deada982">for</span> the data.</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;"> .---------------> ! <span class="GRcorrect" grcontextid="data:0" grmarkguid="ac0e061f-63b3-41a8-bb40-46bcc51a74c8" gruiphraseguid="d4cf96dc-bf5e-43ba-bc27-4b347a67cf03">data</span> ! ! <span class="GRcorrect" grcontextid="data:0" grmarkguid="d76d69ca-c9f6-4352-95bd-f2f28503cfc1" gruiphraseguid="4d1a96c9-7186-48b3-b422-cafd3247bcae">data</span> ! <span class="GRcorrect" grcontextid="etc:0" grmarkguid="dc532e08-9aa3-4461-aadf-d9b8f977765a" gruiphraseguid="1bdb6900-c28d-405c-8524-d469e61ff5e9">etc</span>
/ +------+ !------+
! <span class="GRcorrect" grcontextid="permbits:0" grmarkguid="c1b41710-8442-4774-92b8-e547de09d926" gruiphraseguid="d29b9997-1634-4286-9769-ade103fdb20b">permbits</span>, <span class="GRcorrect" grcontextid="etc:1" grmarkguid="1d5fa365-0694-469a-80f1-b89f429a3f2d" gruiphraseguid="d29b9997-1634-4286-9769-ade103fdb20b">etc</span> ! <span class="GRcorrect" grcontextid="data:0" grmarkguid="039f38a9-62d3-4766-957b-408f8f2a5771" gruiphraseguid="0b4698ef-49a8-4cdc-b2b4-a04977a09837">data</span> addresses !
+------------inode---------------+
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
The filename part carries a name and an associated inode number.</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;"> .--------------> ! <span class="GRcorrect" grcontextid="permbits:0" grmarkguid="bbe33045-3011-401a-8137-e3aa4a581bfa" gruiphraseguid="0541f971-225a-4b90-a58f-8923ed64a33b">permbits</span>, <span class="GRcorrect" grcontextid="etc:1" grmarkguid="5279285d-513c-41a3-ac8f-20bc6d02d276" gruiphraseguid="0541f971-225a-4b90-a58f-8923ed64a33b">etc</span> ! <span class="GRcorrect" grcontextid="addresses:0" grmarkguid="020802d4-69ea-4f9f-84ad-e976566f5cc1" gruiphraseguid="5779150c-c35d-4f07-9921-53724393a762">addresses</span> !
/ +---------inode-------------+
! <span class="GRcorrect" grcontextid="filename:0" grmarkguid="6ca6270c-8935-450c-8be4-3ce35954843b" gruiphraseguid="362a62fe-9af1-4f50-8721-6a6dc7e4dd4b">filename</span> ! <span class="GRcorrect" grcontextid="inode:0" grmarkguid="bfe4d8ba-78fe-4c84-a119-38016be59b16" gruiphraseguid="5150eeac-7567-4689-9732-3f38b716400e">inode</span> # !
+--------------------+
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
More than one filename can reference the same inode number; these files are said to be 'hard linked' together.</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;"> ! <span class="GRcorrect" grcontextid="filename:0" grmarkguid="eda137ac-9d03-4579-8e2c-477809d9e01a" gruiphraseguid="08c37d3c-fffe-44a2-b35e-82f47e8f7d70">filename</span> ! <span class="GRcorrect" grcontextid="inode:0" grmarkguid="14549987-c904-4db7-8a6e-bcc7b79932c7" gruiphraseguid="36acc64b-c29c-457c-901f-19e4472d4891">inode</span> # !
+--------------------+
\
>--------------> ! <span class="GRcorrect" grcontextid="permbits:0" grmarkguid="02bf465b-d82c-462f-a2e8-a98fe2809834" gruiphraseguid="f67f90a2-6271-497a-914d-3dcb28357bee">permbits</span>, <span class="GRcorrect" grcontextid="etc:1" grmarkguid="f70e4ee1-fdf2-49de-8a7b-af229c26935a" gruiphraseguid="f67f90a2-6271-497a-914d-3dcb28357bee">etc</span> ! <span class="GRcorrect" grcontextid="addresses:0" grmarkguid="d639f38d-a3b1-4dc7-a92b-dae9030b86df" gruiphraseguid="f1900f8f-96ff-4297-8a24-bd92314c79df">addresses</span> !
/ +---------inode-------------+
! <span class="GRcorrect" grcontextid="othername:0" grmarkguid="5f1038fa-07f0-49d3-ba7e-bf1ea35082fd" gruiphraseguid="f7fbcdab-5fa6-48cf-bf00-80619e0f7631">othername</span> ! <span class="GRcorrect" grcontextid="inode:0" grmarkguid="3fa361cc-2735-4ea8-b247-1c9bb904804c" gruiphraseguid="b5043994-cee9-43c2-ac9d-441a1f9ab6f3">inode</span> # !
+---------------------+
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
On the other hand, there's a special file type whose data part carries a path to another file. Since it is a special file, the OS recognizes the data as a path, and redirects opens, reads, and writes so that, instead of accessing the data within the special file, they access the data in the file <u>named</u> by the data in the special file. This special file is called a 'soft link' or a 'symbolic link' (aka a '<span class="GRnoSuggestion GRcorrect" grcontextid="symlink:0" grmarkguid="b0c97d48-17f9-4a61-91e9-fd1bd204eb5e" gruiphraseguid="491210bf-894a-4002-a0bf-df587e77a691">symlink</span>').</div>
<a name='more'></a><br />
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;"> ! <span class="GRcorrect" grcontextid="filename:0" grmarkguid="72fccc28-2338-48c6-9661-a3dfd714e979" gruiphraseguid="d6180b64-2078-4f0c-abd2-0d71ee975f68">filename</span> ! <span class="GRcorrect" grcontextid="inode:0" grmarkguid="2b7bc14a-60de-476b-abd7-53f3b795f4e9" gruiphraseguid="d2644266-f2e0-4ee2-8525-197fc69f3773">inode</span> # !
+--------------------+
\
.-------> ! <span class="GRcorrect" grcontextid="permbits:0" grmarkguid="bb17869d-cd49-4d5b-b54c-9fbe2f29baf6" gruiphraseguid="582613ee-ed55-4851-9fee-3a700ffe2b79">permbits</span>, <span class="GRcorrect" grcontextid="etc:1" grmarkguid="8ec9358e-313c-4092-b1f0-a7c07abaf54a" gruiphraseguid="582613ee-ed55-4851-9fee-3a700ffe2b79">etc</span> ! <span class="GRcorrect" grcontextid="addresses:0" grmarkguid="76366bf6-eecd-4866-a09f-3ec779619b84" gruiphraseguid="931cea49-e6ad-4b6f-a24f-99f5d5b0623a">addresses</span> !
+---------inode-------------+
/
/
/
.----------------------------------------------'
(
'--> !"/<span class="GRcorrect" grcontextid="path:0" grmarkguid="a99f3c34-2de1-4364-b5fd-519daf2fd9b7" gruiphraseguid="e02e5cbb-e7b2-4eff-91da-d383cc2d18a0">path</span>/to/some/other/file"!
+---------data-------------+
/ }
<span class="GRcorrect" grcontextid=".:0" grmarkguid="5c934e8a-bb80-4bc2-9db5-52ae3628df68" gruiphraseguid="4aaadaa9-e1d1-4ee0-bceb-6c22642e3116">.</span>~ ~ ~ ~ ~ ~ ~ <span class="GRcorrect" grcontextid="}:1" grmarkguid="af0cab87-bedf-4b97-b49d-22e66aceb97e" gruiphraseguid="4aaadaa9-e1d1-4ee0-bceb-6c22642e3116">}</span>-- (redirected at open<span class="GRcorrect" grcontextid="(:2" grmarkguid="f66b35c6-8c06-4ef8-9355-682063fbe0e4" gruiphraseguid="4aaadaa9-e1d1-4ee0-bceb-6c22642e3116">(</span>) time)
( }
'~~> ! <span class="GRcorrect" grcontextid="filename:0" grmarkguid="c5ae3ce6-a45b-4112-90e5-fa52003306a5" gruiphraseguid="d8d6194a-ec6a-41c7-8f03-bae879bc6fa9">filename</span> ! <span class="GRcorrect" grcontextid="inode:0" grmarkguid="4dac6f61-6792-431f-856e-7d1877d9eb48" gruiphraseguid="9b5968e8-1fae-45a6-b28e-6b3ae491e460">inode</span> # !
+--------------------+
\
'------------> ! <span class="GRcorrect" grcontextid="permbits:0" grmarkguid="1879af75-eec5-4e73-8001-c34745a7df89" gruiphraseguid="8232e0ef-d896-47eb-a2cc-e96dfdf976f2">permbits</span>, <span class="GRcorrect" grcontextid="etc:1" grmarkguid="95278893-245d-4d95-a0ce-6da3b1d37969" gruiphraseguid="8232e0ef-d896-47eb-a2cc-e96dfdf976f2">etc</span> ! <span class="GRcorrect" grcontextid="addresses:0" grmarkguid="0d90a2d1-2ea9-404f-b0d5-136a1235524e" gruiphraseguid="b64d6c0e-efff-47f9-a9cd-4d8efb5871e9">addresses</span> !
+---------inode-------------+
/
/
.----------------------------------------------------'
(
'-> ! <span class="GRcorrect" grcontextid="data:0" grmarkguid="ef60c198-2572-4f77-b4f4-941aeb166783" gruiphraseguid="825e96f7-39e4-48f6-b5a4-c11f24ad033c">data</span> ! ! <span class="GRcorrect" grcontextid="data:0" grmarkguid="8fe82554-8326-42bc-9a38-b0a8409426a7" gruiphraseguid="5567be3b-fdef-4829-b6e9-738af015a024">data</span> ! <span class="GRcorrect" grcontextid="etc.:0" grmarkguid="ddfe001d-567b-4131-b04b-200bef3604b1" gruiphraseguid="dd0af7ca-062b-4c01-85ed-7e6ac73191a6">etc.</span>
+------+ +------+
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
Now, the filename part of the file is stored in a special file of its own along with the filename parts of other files; this special file is called a directory. The directory, as a file, is just an array of filename parts of other files.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
When a directory is built, it is initially populated with the filename parts of two special files: the '.' and '..' files. The filename part <span class="GRcorrect" grcontextid="for:0" grmarkguid="63ec221a-13ce-42ef-9c14-5f6471c79f83" gruiphraseguid="135c8a4b-cc99-4db3-82c6-a6082713edf1">for</span> the '.' file is populated with the inode# of the directory file in which the entry has been made; '.' is a hardlink to the file that implements the current directory.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
The filename part <span class="GRcorrect" grcontextid="for:0" grmarkguid="1b567e98-a274-4ef3-a94b-8ecacb3f8736" gruiphraseguid="0f76c50c-73b4-492b-b6c5-6b72942d7e86">for</span> the '..' file is populated with the inode# of the directory file that contains the filename part of the current directory file. '..' <span class="GRcorrect" grcontextid="is:0" grmarkguid="9081adf3-156b-4793-b15d-3173c1622325" gruiphraseguid="41c0fc34-9075-432f-85c4-e7c2b8836c38">is</span> a <span class="GRcorrect" grcontextid="hardlink:1" grmarkguid="a451567a-2300-4f58-a4e4-4b1ddbaab447" gruiphraseguid="41c0fc34-9075-432f-85c4-e7c2b8836c38">hardlink</span> to the file that implements the immediate parent of the current directory.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
The '<span class="GRcorrect" grcontextid="ln:0" grmarkguid="74459a0c-029b-49cd-9df7-610ed810b92f" gruiphraseguid="1f3c2e54-d0e8-4f26-b025-a0b93839867a">ln</span>' command knows how to build hardlinks and softlinks; the '<span class="GRnoSuggestion GRcorrect" grcontextid="mkdir:1" grmarkguid="2fb72abf-6657-483b-b23d-a186e81071a7" gruiphraseguid="1f3c2e54-d0e8-4f26-b025-a0b93839867a">mkdir</span>' command knows how to build directories (the OS takes care of the above <span class="GRcorrect" grcontextid="hardlinks:2" grmarkguid="be276626-2095-4b87-a642-6773cbb6006e" gruiphraseguid="1f3c2e54-d0e8-4f26-b025-a0b93839867a">hardlinks</span>).</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
There are restrictions on what can be <span class="GRcorrect" grcontextid="hardlinked:0" grmarkguid="27505be3-4c2b-4f8b-906f-976f20b5b24b" gruiphraseguid="311c7987-2855-4cd8-a2a4-aef450795e42">hardlinked</span> (both links must reside on the same filesystem, the source file must exist, etc.) that are not applicable to <span class="GRnoSuggestion GRcorrect" grcontextid="softlinks:1" grmarkguid="e1ca8120-cc62-4209-a8a4-7bda72929133" gruiphraseguid="311c7987-2855-4cd8-a2a4-aef450795e42">softlinks</span> (source and target can be on <span class="GRcorrect" grcontextid="seperate:2" grmarkguid="fc3bae5a-b74b-4c09-ba1c-28d6a7946c4f" gruiphraseguid="311c7987-2855-4cd8-a2a4-aef450795e42">seperate</span> file systems, source does not have to exist, etc.). OTOH, <span class="GRnoSuggestion GRcorrect" grcontextid="softlinks:0" grmarkguid="ca45a4f2-0891-471a-b427-893fb028e49c" gruiphraseguid="e234e4f8-1d43-4dc0-9731-444383980752">softlinks</span> <span class="GRcorrect" grcontextid="have:1" grmarkguid="1ad365bd-ecc8-4635-8237-fb5ff988adb3" gruiphraseguid="e234e4f8-1d43-4dc0-9731-444383980752">have</span> other restrictions not shared by <span class="GRnoSuggestion GRcorrect" grcontextid="hardlinks:2" grmarkguid="8194e6dc-4892-4735-9b5f-3426c1e27e07" gruiphraseguid="e234e4f8-1d43-4dc0-9731-444383980752">hardlinks</span> (additional I/O necessary to complete file access, additional storage taken up by <span class="GRnoSuggestion GRcorrect" grcontextid="softlink:3" grmarkguid="8ab4091d-ceeb-4015-81a1-2666d27bc7fb" gruiphraseguid="e234e4f8-1d43-4dc0-9731-444383980752">softlink</span> file's data, etc.)</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
In other words, there's tradeoffs with each.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
Now, let's demonstrate some of this...</div>
<h3 style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px;">
<span class="GRcorrect" grcontextid="ln:0" grmarkguid="64831103-fdb6-48b6-a9ac-0a16bb481514" gruiphraseguid="f33e2546-8b84-4f7f-a832-1a597cd8fd86">ln</span> in action</h3>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
Let's start off with an empty directory, and create a file in it</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;">~/directory $ <span class="GRcorrect" grcontextid="ls:0" grmarkguid="70d92869-6abb-4d94-b96f-77ea17d1627c" gruiphraseguid="d131cedf-cc8f-4b7c-b209-54601138c890">ls</span> -<span class="GRcorrect" grcontextid="lia:1" grmarkguid="ba367a1c-b6fb-4662-87e4-1005a8a960be" gruiphraseguid="d131cedf-cc8f-4b7c-b209-54601138c890">lia</span>
<span class="GRcorrect" grcontextid="total:0" grmarkguid="bbf33dd1-0e60-4a42-bfa1-3e45b4c1ab80" gruiphraseguid="3bab93a1-7c55-4087-9c06-3f0b86401a2e">total</span> 3
73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:16 .
91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:16 ..
~/directory $ <span class="GRcorrect" grcontextid="echo:0" grmarkguid="f071002f-085a-42b6-af7f-06ef377532f5" gruiphraseguid="14dff9a6-76b2-4b67-ba38-258d5da1d4a1">echo</span> "This is a file" >basic<span class="GRcorrect" grcontextid=".:1" grmarkguid="f98d786e-a7e1-4817-9c41-75000af5cda4" gruiphraseguid="14dff9a6-76b2-4b67-ba38-258d5da1d4a1">.</span>file
~/directory $ <span class="GRcorrect" grcontextid="ls:0" grmarkguid="bf09fd12-8ae2-4742-a8ca-f4de62a281f2" gruiphraseguid="8bc62531-ba63-4433-830d-b1c34c131925">ls</span> -<span class="GRcorrect" grcontextid="lia:1" grmarkguid="abba2e28-78c7-4bcb-923a-44dcbf9878dc" gruiphraseguid="8bc62531-ba63-4433-830d-b1c34c131925">lia</span>
<span class="GRcorrect" grcontextid="total:0" grmarkguid="b6768220-b58a-4b65-9569-1e2f5c2fad58" gruiphraseguid="52ba2a41-8588-4f45-9a30-817eab6055df">total</span> 4
73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:17 .
91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:16 ..
73478 -rw-r--r-- 1 lpitcher users 15 Mar 11 20:17 basic<span class="GRcorrect" grcontextid=".:0" grmarkguid="a199e6d7-7a8c-43e8-b07a-4098cd0b755c" gruiphraseguid="a5818f30-6a11-414c-9180-6b8f6f422032">.</span>file
~/directory $ cat basic<span class="GRcorrect" grcontextid=".:0" grmarkguid="268131ac-e2eb-4648-8b8c-bf76e7aab4ca" gruiphraseguid="d4ce5371-5a12-457f-bd85-35028cfdc833">.</span>file
This is a file
</pre>
<span style="background-color: white; font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">Now, let's make a hardlink to the file</span><pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;">
~/directory $ <span class="GRcorrect" grcontextid="ln:0" grmarkguid="388b64f6-d29b-45fa-87bc-39a3e7d4b8f8" gruiphraseguid="6a11796d-571e-4e2a-ae7b-b59f72548973">ln</span> basic<span class="GRcorrect" grcontextid=".:1" grmarkguid="cf97a897-2770-4b4e-baf4-3d011a9aa3dd" gruiphraseguid="6a11796d-571e-4e2a-ae7b-b59f72548973">.</span>file <span class="GRcorrect" grcontextid="hardlink:2" grmarkguid="ceab804a-edbb-4a51-af56-1e09f0a22324" gruiphraseguid="6a11796d-571e-4e2a-ae7b-b59f72548973">hardlink</span><span class="GRcorrect" grcontextid=".:3" grmarkguid="6f5b2ba0-599c-4148-a020-4c6fe4a33301" gruiphraseguid="6a11796d-571e-4e2a-ae7b-b59f72548973">.</span>file
~/directory $ <span class="GRcorrect" grcontextid="ls:0" grmarkguid="b6baf741-cf0d-4d52-b63e-344f9e59b62f" gruiphraseguid="524a8b3c-a7e2-41ec-a473-538944e14962">ls</span> -<span class="GRcorrect" grcontextid="lia:1" grmarkguid="ca960852-9f69-4eb6-bb91-5edce959f651" gruiphraseguid="524a8b3c-a7e2-41ec-a473-538944e14962">lia</span>
<span class="GRcorrect" grcontextid="total:0" grmarkguid="c64af6ff-9555-4442-9a6e-b8cb8c473611" gruiphraseguid="00129985-37e0-4ad3-ad13-693ac0cf7d11">total</span> 5
73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:20 .
91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:18 ..
73478 -rw-r--r-- 2 lpitcher users 15 Mar 11 20:17 basic<span class="GRcorrect" grcontextid=".:0" grmarkguid="40d34dd8-6f4d-462f-86d5-2a647987cae2" gruiphraseguid="2319c44c-afb0-4d83-b82d-c11da795a293">.</span>file
73478 -rw-r--r-- 2 lpitcher users 15 Mar 11 20:17 <span class="GRnoSuggestion GRcorrect" grcontextid="hardlink:0" grmarkguid="92d68ade-f653-4c2a-a147-2687f18cc75a" gruiphraseguid="2ecab7b4-6a25-4e06-9f8e-dc910a9c333b">hardlink</span><span class="GRcorrect" grcontextid=".:1" grmarkguid="ba0c46a6-62ee-465f-948e-e40da2ea37b1" gruiphraseguid="2ecab7b4-6a25-4e06-9f8e-dc910a9c333b">.</span>file
~/directory $ cat <span class="GRcorrect" grcontextid="hardlink:0" grmarkguid="bff37f85-1dfc-4c17-ad3e-a8c6204afd5a" gruiphraseguid="1d4b0869-93ad-46ef-8e84-6f9784861b0c">hardlink</span><span class="GRcorrect" grcontextid=".:1" grmarkguid="4107f951-47d5-4a14-ba60-9bd84ab1c717" gruiphraseguid="1d4b0869-93ad-46ef-8e84-6f9784861b0c">.</span>file
This is a file
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
We see that:</div>
<ol style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;" type="a">
<li><tt><span class="GRcorrect" grcontextid="hardlink:0" grmarkguid="4e58e9db-28e7-4875-8d90-7dde58892cd2" gruiphraseguid="8a28696a-0a1d-4177-8bd2-bce4cc0ddf03">hardlink</span><span class="GRcorrect" grcontextid=".:1" grmarkguid="84b476c1-a67c-40d4-b3d3-d61f181b7b03" gruiphraseguid="8a28696a-0a1d-4177-8bd2-bce4cc0ddf03">.</span>file</tt> shares the same inode (73478) as basic<span class="GRcorrect" grcontextid=".:2" grmarkguid="bc7c9ac4-beb1-4896-a605-854827170dcf" gruiphraseguid="8a28696a-0a1d-4177-8bd2-bce4cc0ddf03">.</span>file</li>
<li><tt><span class="GRcorrect" grcontextid="hardlink:0" grmarkguid="fb95ff4a-4337-491c-a9bb-fec93353d06e" gruiphraseguid="c51d5c44-a482-4b4c-82ce-7202fa31f786">hardlink</span><span class="GRcorrect" grcontextid=".:1" grmarkguid="1ec1c609-3018-409f-b47a-3eea964f0571" gruiphraseguid="c51d5c44-a482-4b4c-82ce-7202fa31f786">.</span>file</tt> shares the same data as basic<span class="GRcorrect" grcontextid=".:2" grmarkguid="76ee300c-c775-4a60-aa52-517529b88fcf" gruiphraseguid="c51d5c44-a482-4b4c-82ce-7202fa31f786">.</span>file</li>
</ol>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
If we change the permissions on <tt>basic<span class="GRcorrect" grcontextid=".:0" grmarkguid="f4f3c005-2c88-400d-a654-f2bc1b9540f7" gruiphraseguid="ad8040cb-251c-4afd-9e30-a633a498a291">.</span>file</tt>:</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;">~/directory $ <span class="GRnoSuggestion GRcorrect" grcontextid="chmod:0" grmarkguid="e5dcea6f-4df3-44c4-927c-d7fcf987eccb" gruiphraseguid="71c8e065-81cf-426e-8e87-43a94840d27c">chmod</span> a+w basic<span class="GRcorrect" grcontextid=".:1" grmarkguid="c147944b-224c-46db-8164-624a2fc5eee4" gruiphraseguid="71c8e065-81cf-426e-8e87-43a94840d27c">.</span>file
~/directory $ <span class="GRcorrect" grcontextid="ls:0" grmarkguid="2ff27f25-0310-4b25-85a8-be0932c979c5" gruiphraseguid="d45a87c5-6d70-489e-8204-5670d748c3be">ls</span> -<span class="GRcorrect" grcontextid="lia:1" grmarkguid="c0e1014b-d7ed-4100-9bce-f6550a549d93" gruiphraseguid="d45a87c5-6d70-489e-8204-5670d748c3be">lia</span>
<span class="GRcorrect" grcontextid="total:0" grmarkguid="5add5532-4d7b-4aae-aef7-9140594662e6" gruiphraseguid="3386f318-ef33-420d-ad24-dccecc51bc7f">total</span> 5
73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:20 .
91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:18 ..
73478 -rw-rw-rw- 2 lpitcher users 15 Mar 11 20:17 basic.file
73478 -rw-rw-rw- 2 lpitcher users 15 Mar 11 20:17 hardlink.file
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
<span class="GRcorrect" grcontextid="then:0" grmarkguid="062e5f7a-75aa-458e-8d91-78b7dcadbc01" gruiphraseguid="f52187d3-a95d-4945-9efb-b879a1d4f190">then</span> the same permissions change on <tt><span class="GRcorrect" grcontextid="hardlink:1" grmarkguid="85bca1c6-cb4a-4079-88f1-3e8a92b20a3e" gruiphraseguid="f52187d3-a95d-4945-9efb-b879a1d4f190">hardlink</span><span class="GRcorrect" grcontextid=".:2" grmarkguid="094a9e30-4193-46ee-ab72-754e2e8af869" gruiphraseguid="f52187d3-a95d-4945-9efb-b879a1d4f190">.</span>file</tt>.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
The two files (<tt>basic<span class="GRcorrect" grcontextid=".:0" grmarkguid="de6d25ae-f34f-449d-8a24-ea8ea1b60ebd" gruiphraseguid="6be11edc-c853-468a-8395-6755120ff862">.</span>file</tt> and <tt><span class="GRcorrect" grcontextid="hardlink:1" grmarkguid="d38bafb5-5977-46a4-858f-60199a84ecf4" gruiphraseguid="6be11edc-c853-468a-8395-6755120ff862">hardlink</span><span class="GRcorrect" grcontextid=".:2" grmarkguid="8f0f1163-5b76-4099-a5a3-d0a442204a8d" gruiphraseguid="6be11edc-c853-468a-8395-6755120ff862">.</span>file</tt>) share the same inode and data, but have different file names.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
Let's now make a <span class="GRnoSuggestion GRcorrect" grcontextid="softlink:0" grmarkguid="820eadc3-9b49-4a78-b19f-1a99f0143084" gruiphraseguid="5634cfbe-0c3c-417b-ad45-98fdb042a8ea">softlink</span> to the original file:</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;">~/directory $ ln -s basic.file softlink.file
~/directory $ <span class="GRcorrect" grcontextid="ls:0" grmarkguid="1c1c607c-910e-430c-8423-14f6e8e3e793" gruiphraseguid="e6abec91-a9e7-41bf-87c6-f2d1e6e5a450">ls</span> -<span class="GRcorrect" grcontextid="lia:1" grmarkguid="6e0e421e-f43c-4e86-9df7-e968e1cb6c83" gruiphraseguid="e6abec91-a9e7-41bf-87c6-f2d1e6e5a450">lia</span>
<span class="GRcorrect" grcontextid="total:0" grmarkguid="0bf9c93f-c3f1-4662-97b9-947dd09ac1c3" gruiphraseguid="cff8d9f0-adce-41aa-bd29-85a50b8c8032">total</span> 5
73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:24 .
91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:18 ..
73478 -rw-rw-rw- 2 lpitcher users 15 Mar 11 20:17 basic.file
73478 -rw-rw-rw- 2 lpitcher users 15 Mar 11 20:17 hardlink.file
73479 lrwxrwxrwx 1 lpitcher users 10 Mar 11 20:24 softlink.file -> basic.file
~/directory $ cat softlink.file
This is a file
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
Here, we see that although <tt>softlink.file</tt> accesses the same data as <tt>basic.file</tt> and <tt>hardlink.file</tt>, it does not share the same inode (73479 vs 73478), nor does it exhibit the same file permissions. It does show a new permission bit: the 'l' (softlink) bit.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
If we delete <tt>basic.file</tt>:</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;">~/directory $ rm basic.file
~/directory $ <span class="GRcorrect" grcontextid="ls:0" grmarkguid="03600d91-386e-45c4-a0fe-439b0e3515e5" gruiphraseguid="df58c771-d19b-4dde-a09d-27aa7fa65fd6">ls</span> -<span class="GRcorrect" grcontextid="lia:1" grmarkguid="20a69492-2a02-45f4-8ae3-91ba92bb01f0" gruiphraseguid="df58c771-d19b-4dde-a09d-27aa7fa65fd6">lia</span>
<span class="GRcorrect" grcontextid="total:0" grmarkguid="827e4a6c-8520-4e71-bd9b-20ef65ea5591" gruiphraseguid="6791c905-5b04-4f11-9109-d96e685fb8a8">total</span> 4
73477 drwxr-xr-x 2 lpitcher users 1024 Mar 11 20:27 .
91804 drwxr-xr-x 29 lpitcher users 2048 Mar 11 20:18 ..
73478 -rw-rw-rw- 1 lpitcher users 15 Mar 11 20:17 hardlink.file
73479 lrwxrwxrwx 1 lpitcher users 10 Mar 11 20:24 softlink.file -> basic.file
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
then we lose the ability to access the linked data through the softlink:</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;">~/directory $ cat softlink.file
cat: softlink.file: No such file or directory
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
However, we still have access to the original data through the hardlink:</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;">~/directory $ cat <span class="GRcorrect" grcontextid="hardlink:0" grmarkguid="ffc6227b-044b-4d40-88d2-8633bc34457d" gruiphraseguid="4b641e30-17bc-496e-bbc0-2f87d01d125d">hardlink</span><span class="GRcorrect" grcontextid=".:1" grmarkguid="677202f0-fdd2-4bc4-bfad-1c17bd22db50" gruiphraseguid="4b641e30-17bc-496e-bbc0-2f87d01d125d">.</span>file
This is a file
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
You will notice that when we deleted the original file, the hardlink didn't vanish. Similarly, if we had deleted the softlink, the original file wouldn't have vanished.</div>
<h3 style="font-family: verdana, arial, helvetica, sans-serif; font-size: 14px;">
A further note with respect to hardlink files</h3>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
When deleting files, the data part isn't disposed of until all the filename parts have been deleted. There's a count in the inode that indicates how many filenames point to this file, and that count is decremented by 1 each time one of those filenames is deleted. When the count makes it to zero, the inode and its associated data are deleted.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
By the way, the count also reflects how many times the file has been opened without being closed (in other words, how many references to the file are still active). This has some ramifications which aren't obvious at first: you can delete a file so that no "filename" part points to the inode, without releasing the space for the data part of the file, because the file is still open.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
Have you ever found yourself in this position: you notice that <tt>/var/log/messages</tt> (or some other syslog-owned file) has grown too big, and you</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;"> rm /var/log/messages
touch /var/log/messages
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
to reclaim the space, but the used space doesn't reappear? This is because, although you've deleted the filename part, there's a process that's got the data part open still (syslogd), and the OS won't release the space for the data until the process closes it. In order to complete your space reclamation, you have to</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;"> kill -SIGHUP `cat /var/run/syslogd.pid`
</pre>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
to get syslogd to close and reopen the file.</div>
<div style="font-family: verdana, arial, helvetica, sans-serif; font-size: 12px;">
You can use this to your advantage in programs: have you ever wondered how you could <u>hide</u> a temporary file? Well, you could do the following:</div>
<pre class="code" style="background-color: #f4f1bf; border: 1px solid black; font-size: 11px; overflow: auto; padding: 10px;"> {
FILE *fp;
fp = fopen("some.hidden.file","w");
unlink("some.hidden.file"); /* deletes the filename part */
/* some.hidden.file no longer has a filename and is truely hidden */
fprintf(fp,"This data won't be found\n"); /* access the data part */
/*etc*/
fclose(fp); /* finally release the data part */
}</pre>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com2tag:blogger.com,1999:blog-2779013779789891297.post-64744206191384289712012-11-27T20:02:00.002-08:002012-11-27T20:02:29.417-08:00python program behind proxy<br />
<pre style="background-color: #fafafa; border: 1px solid rgb(187, 187, 187); color: #007000; font-family: 'Droid Sans Mono', monospace; font-size: 13px; line-height: 1.5; margin-bottom: 1.5em; margin-top: 1.5em; overflow: auto; padding: 6px 10px; vertical-align: baseline;">export http_proxy="http://localhost:8118"</pre>
<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-82779965758905155592012-11-27T18:54:00.002-08:002012-11-27T20:02:40.857-08:00All about pipI was stucked in pip. Just found out that pip is called "pip-python" in RHEL.<br />
<br />
What's more, pip cannot auto detect system proxy settings, manual specify:<br />
<br />
sudo pip sudo pip-python install virtualenv --proxy localhost:8118<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-28531683202959547252012-11-11T15:15:00.001-08:002012-11-11T15:15:09.509-08:00command sort on last columnAs you know, the linux sort command is agile, which can sort on column using <i>-k</i>.<br />
<br />
However, if we gonna sort on the last column and each row has different number of columns, we can still achieve that with the help of <i>sed</i>.<br />
<br />
<code>
sed 's/^\(.\+\s\+\)\([0-9]\+ *\)$/\2 \1/'
</code><div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-57982325201122926982012-11-08T15:11:00.000-08:002012-11-08T15:11:54.561-08:00Online bood recommenedA page list downloadable book:<br />
<a href="http://cfajohnson.com/computers/pdflinks.shtml">http://cfajohnson.com/computers/pdflinks.shtml</a><br />
<br />
I'm gonna go through the following:<br /><a href="http://ftacademy.org/files/materials/fta-m2-admin_gnulinux-v1.pdf">The GNU/Linux Advanced Administration</a><br />
<a href="http://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf">http://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf</a><br />
<a href="http://www.tldp.org/LDP/abs/abs-guide.pdf">http://www.tldp.org/LDP/abs/abs-guide.pdf</a><br />
<a href="http://www.greenteapress.com/thinkpython/thinkpython.pdf">http://www.greenteapress.com/thinkpython/thinkpython.pdf</a><div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-27499537829376731192012-10-02T19:26:00.002-07:002012-11-15T16:02:03.162-08:00zsh cd tab completion slowIt is quite annoing that zsh seems stuck when completion using tab in a huge directory.<br />
<br />
To speed up the zsh completion, append the following lines to ~/.zshrc<br />
<br />
# Speed up the zsh completion<br />
<br />
zstyle ':completion:*' accept-exact '*(N)'<br />
zstyle ':completion:*' use-cache on<br />
zstyle ':completion:*' cache-path ~/.zsh/cache<br />
<br />
<br />
Sometimes, the directory auto completion works slow under git and svn directories.The solution is to disable it from getting git info and svn info:<br />
<br />
For GIT, add following to .zshrc:<br />
<br />
<br />
<code>
__git_files () {<br />
_wanted files expl 'local files' _files <br />
}<br />
</code>
<br />
<br />
For SVN, append this line to .zshrc:<br />
<br />
<code>
compdef -d svn
</code><div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com1tag:blogger.com,1999:blog-2779013779789891297.post-64653314626190112162012-08-03T00:24:00.002-07:002012-08-03T00:24:41.177-07:00Make GridColumns align in two different Grids in WPF XAMLIn XAML UI, some times we want to make GridColumn Width synchronized with other GridColumns in other Grids.<br />
<br />
WPF provided a property called <span style="background-color: white; color: #333333; font-family: Georgia, 'Bitstream Charter', serif; font-size: 16px; line-height: 24px;"> </span><em style="background-color: white; border: 0px; color: #333333; font-family: Georgia, 'Bitstream Charter', serif; font-size: 16px; line-height: 24px; margin: 0px; padding: 0px; vertical-align: baseline;"><a href="http://msdn.microsoft.com/en-us/library/system.windows.controls.definitionbase.sharedsizegroup.aspx" style="background-color: transparent; background-position: initial initial; background-repeat: initial initial; border: 0px; color: #743399; margin: 0px; padding: 0px; vertical-align: baseline;" target="_blank">SharedSizeGroup</a></em><span style="background-color: white; color: #333333; font-family: Georgia, 'Bitstream Charter', serif; font-size: 16px; line-height: 24px;"> </span> which allows sizing properties shared between ColumnDefinition or RowDefinition.<br />
<br />
And remeber to set Grid.IsSharedSizeScope="True".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMqkY5OOBe0rlgY8-gyXc6DfKXUNSOvpco-dyR4f1CC6rQiROEW5yQT03ruadNTh26mlXAmenmp_C2r3DNuRqgVI-Ausc24rSn-jzLIPKb0HaaAIpsecekTymR2CZYFJlqT4MCRk7ODLze/s1600/Capture.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="68" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMqkY5OOBe0rlgY8-gyXc6DfKXUNSOvpco-dyR4f1CC6rQiROEW5yQT03ruadNTh26mlXAmenmp_C2r3DNuRqgVI-Ausc24rSn-jzLIPKb0HaaAIpsecekTymR2CZYFJlqT4MCRk7ODLze/s320/Capture.PNG" width="320" /></a></div>
<br />
However , when we want one column take up all the available space, like the example above. You will find out that even you write Width="*" still doesn't work as SharedSizeGroup will make it as short as possible.<br />
<br />
My solution is , Shared all the columns size except the one contain TextBox.<br />
<br />
<br />
<Grid Grid.IsSharedSizeScope="True"><br />
<Grid.RowDefinitions><br />
<RowDefinition Height="auto"/><br />
<RowDefinition Height="auto"/><br />
</Grid.RowDefinitions><br />
<Grid Name="Grid1"><br />
<Grid.ColumnDefinitions><br />
<ColumnDefinition Width="auto" SharedSizeGroup="a" /><br />
<ColumnDefinition Width="*" /><br />
<ColumnDefinition Width="auto" SharedSizeGroup="c"/><br />
<ColumnDefinition Width="auto" SharedSizeGroup="d"/><br />
<div>
</Grid.ColumnDefinitions></div>
<div>
....</div>
<div>
</Grid>
</div>
<div>
<Grid Name="Grid2"><br />
<Grid.ColumnDefinitions><br />
<ColumnDefinition Width="auto" SharedSizeGroup="a" /><br />
<ColumnDefinition Width="*" /><br />
<ColumnDefinition Width="auto" SharedSizeGroup="c"/><br />
<ColumnDefinition Width="auto" SharedSizeGroup="d"/><br />
<div>
</Grid.ColumnDefinitions></div>
<div>
.........</div>
<div>
</Grid></div>
</div><div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com13tag:blogger.com,1999:blog-2779013779789891297.post-12543051101742300272012-08-02T22:47:00.000-07:002012-08-03T00:25:44.262-07:00WPF XAML GridSplitter Style<br />
<Style x:Key="gridSplitterStyle" TargetType="{x:Type GridSplitter}"><br />
<Setter Property="FrameworkElement.Height" Value="6"/><br />
<Setter Property="TextElement.Foreground" Value="#FF204D89" /><br />
<Setter Property="Border.BorderThickness" Value="0,0,0,0" /><br />
<Setter Property="UIElement.SnapsToDevicePixels" Value="True" /><br />
<Setter Property="UIElement.Focusable" Value="False" /><br />
<Setter Property="FrameworkElement.Cursor" Value="SizeNS" /><br />
<Setter Property="Control.Template"><br />
<Setter.Value><br />
<ControlTemplate><br />
<Border BorderThickness="0,0,0,0" ><br />
<Canvas Width="19" Height="3"><br />
<Rectangle Fill="{TemplateBinding TextElement.Foreground}" Width="2" Height="2" Canvas.Left="0" Canvas.Top="0" /><br />
<Rectangle Fill="{TemplateBinding TextElement.Foreground}" Width="2" Height="2" Canvas.Left="4" Canvas.Top="0" /><br />
<Rectangle Fill="{TemplateBinding TextElement.Foreground}" Width="2" Height="2" Canvas.Left="8" Canvas.Top="0" /><br />
<Rectangle Fill="{TemplateBinding TextElement.Foreground}" Width="2" Height="2" Canvas.Left="12" Canvas.Top="0" /><br />
<Rectangle Fill="{TemplateBinding TextElement.Foreground}" Width="2" Height="2" Canvas.Left="16" Canvas.Top="0" /><br />
</Canvas><br />
</Border><br />
</ControlTemplate><br />
</Setter.Value><br />
</Setter><br />
</Style><div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0tag:blogger.com,1999:blog-2779013779789891297.post-21150469651216680152012-07-17T05:53:00.001-07:002012-07-17T05:53:07.701-07:00Maven Create a web projectmvn archetype:generate -DgroupId=com.choiceengine -DartifactId=ChoiceEngineSpeedo -DarchetypeArtifactId=maven-archetype-webapp<div class="blogger-post-footer">Steven's Dev Blog
http://dev.gosteven.com
http://www.gosteven.com</div>Steven Youhttp://www.blogger.com/profile/00699734427510079673noreply@blogger.com0