summaryrefslogtreecommitdiff
path: root/public/post/mess-with-bash-2/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'public/post/mess-with-bash-2/index.html')
-rw-r--r--public/post/mess-with-bash-2/index.html276
1 files changed, 0 insertions, 276 deletions
diff --git a/public/post/mess-with-bash-2/index.html b/public/post/mess-with-bash-2/index.html
deleted file mode 100644
index 867eca3..0000000
--- a/public/post/mess-with-bash-2/index.html
+++ /dev/null
@@ -1,276 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
- <meta charset="utf-8">
-
-<title>Mess with Bash(2) | garhve&#x27;s gibberish</title>
-
-
- <link rel="shortcut icon" type="image/png" href="&#x2F;images&#x2F;favicon.png">
- <meta name="viewport" content="width=device-width,initial-scale=1">
-
- <link id="stylesheet" rel="stylesheet" type="text/css" href="/dark.css">
-
- <script type="text/javascript" src="/js/theme.js"></script>
-
-</head>
-
-<div class="header">
- <div class="site_title">
- <p><a href="/"><img src="https:&#x2F;&#x2F;blog.garhve.com&#x2F;images&#x2F;logo.png" alt="garhve&#x27;s gibberish"
- width="70" height=auto></a></p>
- <p><a href="/">&nbsp;garhve&#x27;s gibberish</a></p>
- </div>
- <div class="menu">
- <!-- <a href="/tags">tags</a>
- &nbsp;--><a href="/categories">categories</a>
- </div>
-</div>
-
-<body onload="getTheme()">
- <section class="section">
- <div class="container">
-
-<p>
- <div class="title_postpage">Mess with Bash(2)</div>
-</p>
-<p>
- <div class="date_postpage">2022-09-29</div>
- <div class="taxonomies_postpage">
-
-
- <a href="https://blog.garhve.com/categories/code/">/code</a>
-
-
-
-
- &emsp;<a href="https://blog.garhve.com/tags/bash/">#bash</a>
-
-
- </div>
-</p>
-
-<p>
- <blockquote>
-<p>More info is in this <a href="https://https://guide.bash.academy">tutorial</a>
-Bash scripting <a href="https://devhints.io/bash">cheatsheet</a></p>
-</blockquote>
-<blockquote>
-<p>all value expansions (ie. all syntax with a <code>$</code> prefix) can only expand inside quoted arguments if the argument was <em>double-quoted</em> . Single quotes will turn the dollar-syntax into literal characters, causing bash to output the dollar rather than expand its value in-place!</p>
-</blockquote>
-<p><em>&quot;Value expansions (<code>$...</code>) must <strong>always</strong> be double-quoted.&quot;</em></p>
-<p><em>Never leave a value expansion unquoted.</em></p>
-<h2 id="redirection">Redirection</h2>
-<h3 id="file-redirection">File Redirection</h3>
-<p><strong>0 is standard input, 1 is standard output, 2 is standard error</strong></p>
-<p><code>[x] &gt; file, [x] &lt; file</code></p>
-<p>Make <em><strong>File descriptor</strong></em>(FD) <code>x</code> write to / read from file.</p>
-<blockquote>
-<p><code>echo hello &gt; ~/World</code></p>
-<p><code>read line &lt; ~/Word</code></p>
-<p><code>rm file 2&gt;/dev/null</code></p>
-</blockquote>
-<h3 id="file-descriptor-copying">File Descriptor copying</h3>
-<p><code>[x] &gt;&amp; y, [x] &lt;&amp; y</code></p>
-<p>make FD <code>x</code> write to / read from FD <code>y</code>'s stream</p>
-<blockquote>
-<p>the connection to the stream used by FD <code>y</code> is copied to FD <code>x</code></p>
-<p><code>curl cip.cc &gt; result 2&gt;&amp;1</code></p>
-<p><code>ping localhost &gt; result 2&gt;&amp;1</code></p>
-<pre data-lang="bash" style="background-color:#2e3440;color:#d8dee9;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#616e88;"># exec can be used to change the file descriptors of bash itself,
-</span><span style="color:#616e88;"># and if you use an x that doesn&#39;t yet exist,
-</span><span style="color:#616e88;"># bash will create a new file descriptor (&quot;plug&quot;) for you with that number.
-</span><span style="color:#616e88;"># - in command is to close new FD 3 we&#39;d created before.
-</span><span style="color:#616e88;"># &gt;&amp;- is to close FD 1, &lt;&amp;- is to close FD0
-</span><span style="color:#88c0d0;">exec </span><span style="color:#b48ead;">3</span><span style="color:#81a1c1;">&gt;&amp;</span><span style="color:#b48ead;">1 </span><span style="color:#81a1c1;">&gt;</span><span>mylog</span><span style="color:#81a1c1;">; </span><span style="color:#88c0d0;">echo</span><span> moo</span><span style="color:#81a1c1;">; </span><span style="color:#88c0d0;">exec </span><span style="color:#b48ead;">1</span><span style="color:#81a1c1;">&gt;&amp;</span><span style="color:#b48ead;">3 3</span><span style="color:#81a1c1;">&gt;&amp;</span><span style="color:#eceff4;">-
-</span></code></pre>
-</blockquote>
-<h3 id="appending-file-redirection">Appending file redirection</h3>
-<p><code>[x] &gt;&gt; file</code></p>
-<p>make FD <code>x</code> append to end of the file</p>
-<blockquote>
-<p>A stream to <code>file</code> is opened for writing in append mode and is connected to file descriptor <code>x</code>. The regular file redirection operator <code>&gt;</code> empties the file's contents when it opens the file so that only your bytes will be in the file.</p>
-<p><code>echo hello &gt;&gt; ~/world</code></p>
-<p><code>echo world &gt;&gt; ~/world</code></p>
-</blockquote>
-<h3 id="redirecting-standard-output-and-standard-error">Redirecting standard output and standard error</h3>
-<p><code>&amp;&gt;file</code></p>
-<p>Make both FD 1 (standard output) and FD 2 (standard error) write to file</p>
-<blockquote>
-<p>This is a convenience operator which does the same thing as <code>&gt;file 2&gt;&amp;1</code> but is more concise. Again, you can append rather than truncate by doubling the arrow: <code>&amp;&gt;&gt;file</code></p>
-<p><code>ping localhost &amp;&gt;result</code></p>
-</blockquote>
-<h3 id="here-documents">Here documents</h3>
-<pre data-lang="bash" style="background-color:#2e3440;color:#d8dee9;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#81a1c1;">&lt;&lt;delimiter
-</span><span style="color:#a3be8c;"> Here document
-</span><span style="color:#81a1c1;">delimiter
-</span></code></pre>
-<p>Make FD 0 read from the string between <code>delimiter</code>s</p>
-<blockquote>
-<p>Here-Documents are great for reading blocks of text to command line.</p>
-<pre data-lang="bash" style="background-color:#2e3440;color:#d8dee9;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#88c0d0;">cat </span><span style="color:#81a1c1;">&lt;&lt; EOF
-</span><span style="color:#a3be8c;">this is within here document
-</span><span style="color:#a3be8c;">I can write as many lines as I like
-</span><span style="color:#a3be8c;">and terminate with line of demiliter only
-</span><span style="color:#a3be8c;">EOF //end of heredoc
-</span></code></pre>
-</blockquote>
-<h3 id="here-strings">Here strings</h3>
-<p><code>&lt;&lt;&lt; string</code></p>
-<p>Make FD 0 read from the <code>string</code></p>
-<blockquote>
-<p>Here strings are very similar to here documents but more concise. They are generally preferred over here documents.</p>
-<pre data-lang="bash" style="background-color:#2e3440;color:#d8dee9;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#88c0d0;">cat </span><span style="color:#81a1c1;">&lt;&lt;&lt; </span><span style="color:#a3be8c;">&quot;This,
-</span><span style="color:#a3be8c;">is the here strings. tab will also be read.&quot;
-</span></code></pre>
-</blockquote>
-<h3 id="moving-file-decipher">Moving file decipher</h3>
-<p><code>[x]&gt;&amp;y-, [x]&lt;&amp;y-</code></p>
-<p>Replace FD <code>x</code> with FD <code>y</code> and close FD <code>y</code></p>
-<blockquote>
-<p>Easy way of <code>[x]&gt;&amp;y, y&gt;&amp;-</code></p>
-<pre data-lang="bash" style="background-color:#2e3440;color:#d8dee9;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#616e88;"># 3&gt;&amp;1-: copy FD 1 to FD 3 and close FD 1.
-</span><span style="color:#616e88;"># &gt;&amp;3-: copy FD 3 to FD 1 and close FD 3.
-</span><span style="color:#88c0d0;">exec </span><span style="color:#b48ead;">3</span><span style="color:#81a1c1;">&gt;&amp;</span><span style="color:#b48ead;">1</span><span>- </span><span style="color:#81a1c1;">&gt;</span><span>mylog</span><span style="color:#81a1c1;">; </span><span style="color:#88c0d0;">echo</span><span> moo</span><span style="color:#81a1c1;">; </span><span style="color:#88c0d0;">exec </span><span style="color:#81a1c1;">&gt;&amp;</span><span style="color:#b48ead;">3</span><span>-
-</span></code></pre>
-</blockquote>
-<h3 id="reading-and-writing-with-file-descriptor">Reading and writing with file descriptor</h3>
-<p><code>[x] &lt;&gt; file</code></p>
-<p>Open FD <code>x</code> for both reading and writing to <code>file</code></p>
-<blockquote>
-<p>The file descriptor at x is opened with a stream to the file that can be used for writing as well as reading bytes. Usually you'll use two file descriptors for this. <strong>One of the rare cases where this is useful is when setting up a stream with a read/write device such as a network socket</strong>.</p>
-<pre data-lang="bash" style="background-color:#2e3440;color:#d8dee9;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#88c0d0;">exec </span><span style="color:#b48ead;">5</span><span style="color:#81a1c1;">&lt;&gt;</span><span>aFile
-</span><span style="color:#88c0d0;">cat </span><span style="color:#81a1c1;">&gt;&amp;</span><span style="color:#b48ead;">5 </span><span style="color:#a3be8c;">&quot;Hello world&quot; </span><span style="color:#616e88;"># make FD 1 write to where FD 5 currently writing, copy file descriptor FD 5 to FD 1
-</span><span style="color:#88c0d0;">cat </span><span style="color:#81a1c1;">&lt;&amp;</span><span style="color:#b48ead;">5 </span><span style="color:#616e88;"># make FD 0 read from where FD 5 currently reading, copy file descriptor FD 5 to FD 0, then cat will send content to FD 1
-</span></code></pre>
-</blockquote>
-<p>Exercise</p>
-<blockquote>
-<p>Q: fix <code>exec 3&gt;&amp;2 2&gt;log; echo 'Hello!'; exec 2&gt;&amp;3</code> so that the message is properly saved into the <code>log</code> file and such that FD 3 is properly closed afterwards:</p>
-<p>A:</p>
-<ol>
-<li><code>exec 3&gt;&amp;1- 3&gt;log; echo 'Hello!'; exec 1&gt;&amp;3-</code></li>
-<li><code>exec 3&gt;&amp;1 1&gt;&amp;- 3&gt;log; echo 'Hello!'; exec 1&gt;&amp;3 3&gt;&amp;-</code></li>
-</ol>
-</blockquote>
-<h2 id="expansion">Expansion</h2>
-<h3 id="pathname-expansion">pathname expansion</h3>
-<ol>
-<li>
-<p>pattern expansion is performed by bash before command even execute</p>
-<blockquote>
-<p><code>file *</code> will show info about all file in current directory. <code>*</code> will expand to content before <code>file</code> execute.</p>
-</blockquote>
-</li>
-<li>
-<p>A <em>glob</em> is the name of the type of pattern supported by the bash shell.</p>
-<blockquote>
-<p>basic glob name supported by bash<img src="https://assets.garhve.com/pictures/screenshots/2022/10/1665123982.png" alt="explanation" /></p>
-<p><img src="https://assets.garhve.com/pictures/screenshots/2022/10/1665133964.png" alt="example" /></p>
-<p><strong>Those glob will only affect current directory, explicit expression is required to working on other directory.</strong> <code>ls /sub/*</code></p>
-</blockquote>
-</li>
-<li>
-<p>extended glob can be enable to get more powerful but also easy confusing feature of bash</p>
-<blockquote>
-<p>bash: <code>shopt -s extglob</code>
-zsh. : <code>setopt extendedglob</code>
-<img src="https://assets.garhve.com/pictures/screenshots/2022/10/1665134156.png" alt="explanation" /></p>
-<p><img src="https://assets.garhve.com/pictures/screenshots/2022/10/1665134205.png" alt="!(my)* get expand because of * is outside !(), which makes it expland another whole pathname" /></p>
-</blockquote>
-</li>
-</ol>
-<h3 id="command-substitution">Command Substitution</h3>
-<p>we can expansion commands within commands, but must use double-quote <code>&quot;&quot;</code> instead of <code>''</code></p>
-<pre data-lang="bash" style="background-color:#2e3440;color:#d8dee9;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#616e88;"># this will output contents in hello.h to screen
-</span><span style="color:#88c0d0;">cat</span><span> hello.h
-</span><span>
-</span><span style="color:#616e88;"># this will expand `cat hello.h` to real contents in
-</span><span style="color:#616e88;"># file hello.h and concatenate to previous sentence
-</span><span style="color:#88c0d0;">echo </span><span style="color:#a3be8c;">&quot;file hello.h contains contents of </span><span style="color:#81a1c1;">$</span><span style="color:#a3be8c;">(</span><span style="color:#88c0d0;">cat</span><span style="color:#a3be8c;"> hello.h)&quot;
-</span><span>
-</span><span style="color:#616e88;"># this will output &#39;file hello.h contains contents of $(cat hello.h)&#39;
-</span><span style="color:#616e88;"># without expand command in $()
-</span><span style="color:#88c0d0;">echo </span><span style="color:#a3be8c;">&#39;file hello.h contains contents of $(cat hello.h)&#39;
-</span></code></pre>
-<p>In command, <code>$()</code> is called <em>value expansion</em>, it consists of value-expansion prefix <code>$</code> and subshell <code>(...)</code>. A subshell is essentially a small new bash process that is used to run a command while the main bash shell waits for the result.</p>
-<h2 id="parameters">Parameters</h2>
-<p>There are three kind of parameters:</p>
-<ol>
-<li>Environment Parameter</li>
-<li>Positional Parameter</li>
-<li>Variables</li>
-</ol>
-<h3 id="environment-parameter">Environment Parameter</h3>
-<p>environment variables exist at the process level. That means they are not a feature of the bash shell, but rather a feature of any program process on your system. They can inherit by children, but children's EV can't be given to parent.</p>
-<h3 id="positional-parameter">Positional Parameter</h3>
-<p>Just as name indicates, these kind of parameters indicate arguments' position, and always starting from 0.</p>
-<p>for example, imaging we have a script <code>rename</code>, arguments could be passed to it to extend its usage:</p>
-<p><code>rename dir name</code> there, we passed <code>dir</code> and <code>name</code> as argument, so that positional parameters in script would be <code>$1</code> and <code>$2</code>, representing arguments respectively. after <code>$2</code>, such as <code>$3</code> is unset since there has no more argument.</p>
-<blockquote>
-<p>Positional Parameter is read-only</p>
-</blockquote>
-<p>a new usage: <code>bash -c 'ls &quot;$1&quot;' -- '/home'</code>. This will working like <code>ls /home</code>, dash is necessary since it is first variable in shell we ran commands and it makes positional value of arguments populated after it stand as we expect in shell single-quoted command gonna run in.</p>
-<h3 id="special-parameter">Special Parameter</h3>
-<p>Special parameters are parameters whose name is a single symbolic character, they are used to request certain state information from the bash shell. Like positional parameter, they are <em>read-only</em>.</p>
-<p><img src="https://assets.garhve.com/pictures/screenshots/2022/10/1666054171.png" alt="different kinds of special parameters and the information they hold" /></p>
-<h3 id="variables">Variables</h3>
-<p>definition: <code>name=value</code> <em>//no space around <code>=</code> like other programming language support</em></p>
-<p>call: like <em>command expansion</em>, using variable is to expand it with prefix <code>$</code>, e.g. <code>$name</code></p>
-<ul>
-<li>Keep in mind, Expansion should always be double-quoted *</li>
-</ul>
-<h3 id="parameter-expansion">Parameter expansion</h3>
-<blockquote>
-<p><a href="https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html">GNU material</a></p>
-</blockquote>
-<p>we expand parameters by prefixing their name with a <code>$</code> symbol</p>
-<blockquote>
-<p>e.g. <code>name=me; echo hello &quot;$name&quot;</code>. <code>hello me</code>.</p>
-</blockquote>
-<p>In addition, we can put braces (<code>{</code> and <code>}</code>) around our parameter, which indicates where variable is about to begin and end.</p>
-<blockquote>
-<p>e.g. <code>name=orange; echo there are 4 &quot;${name}s&quot;</code> <code>there are 4 oranges</code>.</p>
-<pre data-lang="bash" style="background-color:#2e3440;color:#d8dee9;" class="language-bash "><code class="language-bash" data-lang="bash"><span>name</span><span style="color:#81a1c1;">=</span><span style="color:#a3be8c;">orange
-</span><span style="color:#88c0d0;">echo </span><span style="color:#a3be8c;">&quot;there are 4 </span><span style="color:#81a1c1;">$</span><span style="color:#a3be8c;">{</span><span>name</span><span style="color:#a3be8c;">}s.&quot; </span><span style="color:#616e88;"># there are 4 oranges.
-</span><span style="color:#88c0d0;">echo </span><span style="color:#a3be8c;">&quot;there are 4 </span><span style="color:#81a1c1;">$</span><span>names</span><span style="color:#a3be8c;">.&quot; </span><span style="color:#616e88;"># there are 4 .
-</span></code></pre>
-<p>here, we put <code>{}</code>around<code>name</code>so that bash can be told that suffix <code>s</code> is not a part of variable. otherwise, it will treat <code>names</code> as parameter and looking for its value, which is none in our example.</p>
-</blockquote>
-<p>parameter expansion brings up a powerful feature: <em>parameter expansion oerators</em></p>
-<blockquote>
-<p>While expanding a parameter, it is possible to apply an operator to the expanding value without alternate original value.</p>
-<p>I use these mostly</p>
-<pre data-lang="bash" style="background-color:#2e3440;color:#d8dee9;" class="language-bash "><code class="language-bash" data-lang="bash"><span style="color:#616e88;"># remove string before pattern ${name#pattern} shortest ${name##pattern} longest
-</span><span style="color:#616e88;"># remove string after pattern ${name%pattern} longest ${name%%pattern} shortest
-</span><span style="color:#616e88;"># delete first matching pattern ${name/pattern}
-</span><span style="color:#616e88;"># delete all matching pattern ${name//pattern}
-</span><span style="color:#616e88;"># substitute pattern with string ${name//pattern/string}
-</span><span>
-</span><span>foo</span><span style="color:#81a1c1;">=</span><span style="color:#a3be8c;">&quot;foo-bar-foobar&quot;
-</span><span style="color:#88c0d0;">echo </span><span style="color:#81a1c1;">$</span><span>{foo</span><span style="color:#81a1c1;">#*</span><span>-} </span><span style="color:#616e88;"># echoes &#39;bar-foobar&#39; (Removes &#39;foo-&#39; because that matches &#39;*-&#39;)
-</span><span style="color:#88c0d0;">echo </span><span style="color:#81a1c1;">$</span><span>{foo</span><span style="color:#81a1c1;">##*</span><span>-} </span><span style="color:#616e88;"># echoes &#39;foobar&#39; (Removes &#39;foo-bar-&#39;)
-</span><span style="color:#88c0d0;">echo </span><span style="color:#81a1c1;">$</span><span>{foo</span><span style="color:#81a1c1;">%</span><span>-</span><span style="color:#81a1c1;">*</span><span>} </span><span style="color:#616e88;"># echoes &#39;foo-bar&#39;
-</span><span style="color:#88c0d0;">echo </span><span style="color:#81a1c1;">$</span><span>{foo</span><span style="color:#81a1c1;">%%</span><span>-</span><span style="color:#81a1c1;">*</span><span>} </span><span style="color:#616e88;"># echoes &#39;foo&#39;
-</span><span style="color:#88c0d0;">echo </span><span style="color:#81a1c1;">$</span><span>{foo</span><span style="color:#81a1c1;">/</span><span>-} </span><span style="color:#616e88;"># echoes &#39;foobar-foobar&#39;
-</span><span style="color:#88c0d0;">echo </span><span style="color:#81a1c1;">$</span><span>{foo</span><span style="color:#81a1c1;">/</span><span>/-} </span><span style="color:#616e88;"># echoes &#39;foobarfoobar&#39;
-</span><span style="color:#88c0d0;">echo </span><span style="color:#81a1c1;">$</span><span>{foo</span><span style="color:#81a1c1;">/</span><span>/-</span><span style="color:#81a1c1;">/</span><span>_} </span><span style="color:#616e88;"># echoes &#39;foo_bar_foobar&#39;
-</span></code></pre>
-</blockquote>
-<p><img src="https://assets.garhve.com/pictures/screenshots/2022/10/1665660923.png" alt="part of operators as shown picture" /></p>
-
-</p>
-
-
-
-
- </div>
- </section>
-</body>
-
-<div class="footer">
- &emsp;&copy; garhve
-</div>
-
-</html>