bash-hackers-wiki/commands/builtin/read/index.html

98 lines
60 KiB
HTML
Raw Normal View History

<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link href=https://flokoe.github.io/bash-hackers-wiki/commands/builtin/read/ rel=canonical><link href=../printf/ rel=prev><link href=../readonly/ rel=next><link rel=icon href=../../../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.5.44"><title>The read builtin command - The Bash Hackers Wiki</title><link rel=stylesheet href=../../../assets/stylesheets/main.0253249f.min.css><link rel=stylesheet href=../../../assets/stylesheets/palette.06af60db.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#the-read-builtin-command class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <header class=md-header data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=../../.. title="The Bash Hackers Wiki" class="md-header__button md-logo" aria-label="The Bash Hackers Wiki" data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> The Bash Hackers Wiki </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> The read builtin command </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to dark mode" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=indigo data-md-color-accent=indigo aria-label="Switch to light mode" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> </form> <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var m
</code></pre></div> <h2 id=description>Description<a class=headerlink href=#description title="Permanent link">&para;</a></h2> <p>The <code>read</code> builtin reads <strong>one line</strong> of data (text, user input, ...) from standard input or a supplied filedescriptor number into one or more variables named by <code>&lt;NAME...&gt;</code>.</p> <p>Since Bash 4.3-alpha, <code>read</code> skips any <code>NUL</code> (ASCII code 0) characters in input.</p> <p>If <code>&lt;NAME...&gt;</code> is given, the line is word-split using <a href=../../../syntax/shellvars/#IFS>IFS</a> variable, and every word is assigned to one <code>&lt;NAME&gt;</code>. The remaining words are all assigned to the last <code>&lt;NAME&gt;</code> if more words than variable names are present.</p> <div class="admonition info"> <p class=admonition-title>Info</p> <p>If no <code>&lt;NAME&gt;</code> is given, the whole line read (without performing word-splitting!) is assigned to the shell variable <a href=../../../syntax/shellvars/#REPLY>REPLY</a>. Then, <code>REPLY</code> really contains the line as it was read, without stripping pre- and postfix spaces and other things!</p> <div class=highlight><pre><span></span><code>while read -r; do
printf &#39;&quot;%s&quot;\n&#39; &quot;$REPLY&quot;
done &lt;&lt;&lt;&quot; a line with prefix and postfix space &quot;
</code></pre></div> </div> <p>If a timeout is given, or if the shell variable <a href=../../../syntax/shellvars/#TMOUT>TMOUT</a> is set, it is counted from initially waiting for input until the completion of input (i.e. until the complete line is read). That means the timeout can occur during input, too.</p> <h3 id=options>Options<a class=headerlink href=#options title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Option</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>-a &lt;ARRAY&gt;</code></td> <td>read the data word-wise into the specified array <code>&lt;ARRAY&gt;</code> instead of normal variables</td> </tr> <tr> <td><code>-d &lt;DELIM&gt;</code></td> <td>recognize <code>&lt;DELIM&gt;</code> as data-end, rather than <code>&lt;newline&gt;</code></td> </tr> <tr> <td><code>-e</code></td> <td>on interactive shells: use Bash's readline interface to read the data. Since version 5.1-alpha, this can also be used on specified file descriptors using <code>-u</code></td> </tr> <tr> <td><code>-i &lt;STRING&gt;</code></td> <td>preloads the input buffer with text from <code>&lt;STRING&gt;</code>, only works when Readline (<code>-e</code>) is used</td> </tr> <tr> <td><code>-n &lt;NCHARS&gt;</code></td> <td>reads <code>&lt;NCHARS&gt;</code> characters of input, then quits</td> </tr> <tr> <td><code>-N &lt;NCHARS&gt;</code></td> <td>reads <code>&lt;NCHARS&gt;</code> characters of input, <em>ignoring any delimiter</em>, then quits</td> </tr> <tr> <td><code>-p &lt;PROMPT&gt;</code></td> <td>the prompt string <code>&lt;PROMPT&gt;</code> is output (without a trailing automatic newline) before the read is performed</td> </tr> <tr> <td><code>-r</code></td> <td>raw input - <strong>disables</strong> interpretion of <strong>backslash escapes</strong> and <strong>line-continuation</strong> in the read data</td> </tr> <tr> <td><code>-s</code></td> <td>secure input - don't echo input if on a terminal (passwords!)</td> </tr> <tr> <td><code>-t &lt;TIMEOUT&gt;</code></td> <td>wait for data <code>&lt;TIMEOUT&gt;</code> seconds, then quit (exit code 1). Fractional seconds ("5.33") are allowed since Bash 4. A value of 0 immediately returns and indicates if data is waiting in the exit code. Timeout is indicated by an exit code greater than 128. If timeout arrives before data is read completely (before end-of-line), the partial data is saved.</td> </tr> <tr> <td><code>-u &lt;FD&gt;</code></td> <td>use the filedescriptor number <code>&lt;FD&gt;</code> rather than <code>stdin</code> (0)</td> </tr> </tbody> </table> <p>When both, <code>-a &lt;ARRAY&gt;</code> and a variable name <code>&lt;NAME&gt;</code> is given, then the array is set, but not the variable.</p> <p>Of course it's valid to set individual array elements without using <code>-a</code>:</p> <div class=highlight><pre><span></span><code>read MYARRAY[5]
</code></pre></div> <div class="admonition warning"> <p class=admonition-title>Warning</p> <p>Reading into array elements using the syntax above <strong>may cause <a href=../../../syntax/expansion/globs/ >pathname expansion</a> to occur</strong>.</p> <p>Example: You are in a directory with a file named <code>x1</code>, and you want to read into an array <code>x</code>, index <code>1</code> with</p> <div class=highlight><pre><span></span><code>read x[1]
</code></pre></div> <p>then pathname expansion will expand to the filename <code>x1</code> and break your processing!</p> <p>Even worse, if <code>nullglob</code> is set, your array/index will disappear.</p> <p>To avoid this, either <strong>disable pathname expansion</strong> or <strong>quote</strong> the array name and index:</p> <div class=highlight><pre><span></span><code>read &#39;x[1]&#39;
</code></pre></div> </div> <h3 id=return-status>Return status<a class=headerlink href=#return-status title="Permanent link">&para;</a></h3> <table> <thead> <tr> <th>Status</th> <th>Reason</th> </tr> </thead> <tbody> <tr> <td>0</td> <td>no error</td> </tr> <tr> <td>0</td> <td>error when assigning to a read-only variable <sup id=fnref:1><a class=footnote-ref href=#fn:1>1</a></sup></td> </tr> <tr> <td>2</td> <td>invalid option</td> </tr> <tr> <td>&gt;128</td> <td>timeout (see <code>-t</code>)</td> </tr> <tr> <td>!=0</td> <td>invalid filedescriptor supplied to <code>-u</code></td> </tr> <tr> <td>!=0</td> <td>end-of-file reached</td> </tr> </tbody> </table> <h3 id=read-without-r>read without -r<a class=headerlink href=#read-without-r title="Permanent link">&para;</a></h3> <p>Essentially all you need to know about <code>-r</code> is to <strong>ALWAYS</strong> use it. The exact behavior you get without <code>-r</code> is completely useless even for weird purposes. It basically allows the escaping of input which matches something in IFS, and also escapes line continuations. It's explained pretty well in the <a href=http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html#tag_20_109>POSIX read</a> spec.</p> <div class=highlight><pre><span></span><code>2012-05-23 13:48:31 geirha it should only remove the backslashes, not change \n and \t and such into newlines and tabs
2012-05-23 13:49:00 ormaaj so that&#39;s what read without -r does?
2012-05-23 13:49:16 geirha no, -r doesn&#39;t remove the backslashes
2012-05-23 13:49:34 ormaaj I thought read &lt;&lt;&lt;&#39;str&#39; was equivalent to read -r &lt;&lt;&lt;$&#39;str&#39;
2012-05-23 13:49:38 geirha # read x y &lt;&lt;&lt; &#39;foo\ bar baz&#39;; echo &quot;&lt;$x&gt;&lt;$y&gt;&quot;
2012-05-23 13:49:40 shbot geirha: &lt;foo bar&gt;&lt;baz&gt;
2012-05-23 13:50:32 geirha no, read without -r is mostly pointless. Damn bourne
2012-05-23 13:51:08 ormaaj So it&#39;s mostly (entirely) used to escape spaces
2012-05-23 13:51:24 ormaaj and insert newlines
2012-05-23 13:51:47 geirha ormaaj: you mostly get the same effect as using \ at the prompt
2012-05-23 13:52:04 geirha echo \&quot; outputs a &quot; , read x &lt;&lt;&lt; &#39;\&quot;&#39; reads a &quot;
2012-05-23 13:52:32 ormaaj oh weird
2012-05-23 13:52:46 * ormaaj struggles to think of a point to that...
2012-05-23 13:53:01 geirha ormaaj: ask Bourne :P
2012-05-23 13:53:20 geirha (not Jason)
2012-05-23 13:53:56 ormaaj hm thanks anyway :)
</code></pre></div> <h2 id=examples>Examples<a class=headerlink href=#examples title="Permanent link">&para;</a></h2> <h3 id=rudimentary-cat-replacement>Rudimentary cat replacement<a class=headerlink href=#rudimentary-cat-replacement title="Permanent link">&para;</a></h3> <p>A rudimentary replacement for the <code>cat</code> command: read lines of input from a file and print them on the terminal.</p> <div class=highlight><pre><span></span><code>opossum() {
while read -r; do
printf &quot;%s\n&quot; &quot;$REPLY&quot;
done &lt;&quot;$1&quot;
}
</code></pre></div> <p><u><strong>Note:</strong></u> Here, <code>read -r</code> and the default <code>REPLY</code> is used, because we want to have the real literal line, without any mangeling. <code>printf</code> is used, because (depending on settings), <code>echo</code> may interpret some baskslash-escapes or switches (like <code>-n</code>).</p> <h3 id=press-any-key>Press any key...<a class=headerlink href=#press-any-key title="Permanent link">&para;</a></h3> <p>Remember the MSDOS <code>pause</code> command? Here's something similar:</p> <div class=highlight><pre><span></span><code>pause() {
local dummy
read -s -r -p &quot;Press any key to continue...&quot; -n 1 dummy
}
</code></pre></div> <p>Notes:</p> <ul> <li><code>-s</code> to suppress terminal echo (printing)</li> <li><code>-r</code> to not interpret special characters (like waiting for a second character if somebody presses the backslash)</li> </ul> <h3 id=reading-columns>Reading Columns<a class=headerlink href=#reading-columns title="Permanent link">&para;</a></h3> <h4 id=simple-split>Simple Split<a class=headerlink href=#simple-split title="Permanent link">&para;</a></h4> <p>Read can be used to split a string:</p> <div class=highlight><pre><span></span><code>var=&quot;one two three&quot;
read -r col1 col2 col3 &lt;&lt;&lt; &quot;$var&quot;
printf &quot;col1: %s col2: %s col3 %s\n&quot; &quot;$col1&quot; &quot;$col2&quot; &quot;$col3&quot;
</code></pre></div> <p>Take care that you cannot use a pipe:</p> <div class=highlight><pre><span></span><code>echo &quot;$var&quot; | read col1 col2 col3 # does not work!
printf &quot;col1: %s col2: %s col3 %s\n&quot; &quot;$col1&quot; &quot;$col2&quot; &quot;$col3&quot;
</code></pre></div> <p>Why? because the commands of the pipe run in subshells that cannot modify the parent shell. As a result, the variables <code>col1</code>, <code>col2</code> and <code>col3</code> of the parent shell are not modified (see article: <a href=../../../scripting/processtree/ >processtree</a>).</p> <p>If the variable has more fields than there are variables, the last variable get the remaining of the line:</p> <div class=highlight><pre><span></span><code>read col1 col2 col3 &lt;&lt;&lt; &quot;one two three four&quot;
printf &quot;%s\n&quot; &quot;$col3&quot; #prints three four
</code></pre></div> <h4 id=changing-the-separator>Changing The Separator<a class=headerlink href=#changing-the-separator title="Permanent link">&para;</a></h4> <p>By default reads separates the line in fields using spaces or tabs. You can modify this using the <em>special variable</em> <a href=../../../syntax/shellvars/#IFS>IFS</a>, the Internal Field Separator.</p> <div class=highlight><pre><span></span><code>IFS=&quot;:&quot; read -r col1 col2 &lt;&lt;&lt; &quot;hello:world&quot;
printf &quot;col1: %s col2: %s\n&quot; &quot;$col1&quot; &quot;$col2&quot;
</code></pre></div> <p>Here we use the <code>var=value command</code> syntax to set the environment of <code>read</code> temporarily. We could have set <code>IFS</code> normally, but then we would have to take care to save its value and restore it afterward (<code>OLD=$IFS IFS=":"; read ....;IFS=$OLD</code>).</p> <p>The default <code>IFS</code> is special in that 2 fields can be separated by one or more space or tab. When you set <code>IFS</code> to something besides whitespace (space or tab), the fields are separated by <strong>exactly</strong> one character:</p> <div class=highlight><pre><span></span><code>IFS=&quot;:&quot; read -r col1 col2 col3 &lt;&lt;&lt; &quot;hello::world&quot;
printf &quot;col1: %s col2: %s col3 %s\n&quot; &quot;$col1&quot; &quot;$col2&quot; &quot;$col3&quot;
</code></pre></div> <p>See how the <code>::</code> in the middle infact defines an additional <em>empty field</em>.</p> <p>The fields are separated by exactly one character, but the character can be different between each field:</p> <div class=highlight><pre><span></span><code>IFS=&quot;:|@&quot; read -r col1 col2 col3 col4 &lt;&lt;&lt; &quot;hello:world|in@bash&quot;
printf &quot;col1: %s col2: %s col3 %s col4 %s\n&quot; &quot;$col1&quot; &quot;$col2&quot; &quot;$col3&quot; &quot;$col4&quot;
</code></pre></div> <h3 id=are-you-sure>Are you sure?<a class=headerlink href=#are-you-sure title="Permanent link">&para;</a></h3> <div class=highlight><pre><span></span><code>asksure() {
echo -n &quot;Are you sure (Y/N)? &quot;
while read -r -n 1 -s answer; do
if [[ $answer = [YyNn] ]]; then
[[ $answer = [Yy] ]] &amp;&amp; retval=0
[[ $answer = [Nn] ]] &amp;&amp; retval=1
break
fi
done
echo # just a final linefeed, optics...
return $retval
}
### using it
if asksure; then
echo &quot;Okay, performing rm -rf / then, master....&quot;
else
echo &quot;Pfff...&quot;
fi
</code></pre></div> <h3 id=ask-for-a-path-with-a-default-value>Ask for a path with a default value<a class=headerlink href=#ask-for-a-path-with-a-default-value title="Permanent link">&para;</a></h3> <p><u><strong>Note:</strong></u> The <code>-i</code> option was introduced with Bash 4</p> <div class=highlight><pre><span></span><code>read -e -p &quot;Enter the path to the file: &quot; -i &quot;/usr/local/etc/&quot; FILEPATH
</code></pre></div> <p>The user will be prompted, he can just accept the default, or edit it.</p> <h3 id=multichar-ifs-parsing-a-simple-datetime-string>Multichar-IFS: Parsing a simple date/time string<a class=headerlink href=#multichar-ifs-parsing-a-simple-datetime-string title="Permanent link">&para;</a></h3> <p>Here, <code>IFS</code> contains both, a colon and a space. The fields of the date/time string are recognized correctly.</p> <div class=highlight><pre><span></span><code>datetime=&quot;2008:07:04 00:34:45&quot;
IFS=&quot;: &quot; read -r year month day hour minute second &lt;&lt;&lt; &quot;$datetime&quot;
</code></pre></div> <h2 id=portability-considerations>Portability considerations<a class=headerlink href=#portability-considerations title="Permanent link">&para;</a></h2> <ul> <li>POSIX&reg; only specified the <code>-r</code> option (raw read); <code>-r</code> is not only POSIX, you can find it in earlier Bourne source code</li> <li>POSIX&reg; doesn't support arrays</li> <li><code>REPLY</code> is not POSIX&reg;, you need to set <code>IFS</code> to the empty string to get the whole line for shells that don't know <code>REPLY</code>. <code>while IFS= read -r line; do ... done &lt; text.txt</code></li> </ul> <h2 id=see-also>See also<a class=headerlink href=#see-also title="Permanent link">&para;</a></h2> <ul> <li>Internal: <a href=../printf/ >The printf builtin command</a></li> </ul> <div class=footnote> <hr> <ol> <li id=fn:1> <p>fixed in 4.2-rc1&#160;<a class=footnote-backref href=#fnref:1 title="Jump back to footnote 1 in the text">&#8617;</a></p> </li> </ol> </div> <aside class=md-source-file> <span class=md-source-file__fact> <span class=md-icon title="Last update"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg> </span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">November 13, 2024</span> </span> <span class=md-source-file__fact> <span class=md-icon title=Created> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M14.47 15.08 11 13V7h1.5v5.25l3.08 1.83c-.41.28-.79.62-1.11 1m-1.39 4.84c-.36.05-.71.08-1.08.08-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8c0 .37-.03.72-.08 1.08.69.1 1.33.32 1.92.64.1-.56.16-1.13.16-1.72 0-5.5-4.5-10-10-10S2 6.5 2 12s4.47 10 10 10c.59 0 1.16-.06 1.72-.16-.32-.59-.54-1.23-.64-1.92M18 15v3h-3v2h3v3h2v-3h3v-2h-3v-3z"/></svg> </span> <span class="git-revision-date-localized-plugin git-revision-date-localized-plugin-date">November 13, 2024</span> </span> </aside> <h2 id=__comments>Comments</h2> <script src=https://giscus.app/client.js data-repo=flokoe/bash-hackers-wiki data-repo-id=R_kgDOJ3Nr6Q data-category="Giscus Page Comments" data-category-id=DIC_kwDOJ3Nr6c4CXq9t data-mapping=pathname data-strict=1 data-reactions-enabled=1 data-emit-metadata=0 data-input-position=top data-theme=preferred_color_scheme data-lang=en data-loading=lazy crossorigin=anonymous async>
</script> <script>
var giscus = document.querySelector("script[src*=giscus]")
/* Set palette on initial load */
var palette = __md_get("__palette")
if (palette && typeof palette.color === "object") {
var theme = palette.color.scheme === "slate" ? "dark" : "light"
giscus.setAttribute("data-theme", theme)
}
/* Register event handlers after documented loaded */
document.addEventListener("DOMContentLoaded", function() {
var ref = document.querySelector("[data-md-component=palette]")
ref.addEventListener("change", function() {
var palette = __md_get("__palette")
if (palette && typeof palette.color === "object") {
var theme = palette.color.scheme === "slate" ? "dark" : "light"
/* Instruct Giscus to change theme */
var frame = document.querySelector(".giscus-frame")
frame.contentWindow.postMessage(
{ giscus: { setConfig: { theme } } },
"https://giscus.app"
)
}
})
})
</script> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class=md-footer> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"base": "../../..", "features": ["navigation.instant", "navigation.tracking", "navigation.tabs", "navigation.sections", "navigation.top", "content.action.view", "content.action.edit", "search.suggest", "search.highlight", "content.code.copy"], "search": "../../../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script> <script src=../../../assets/javascripts/bundle.83f73b43.min.js></script> </body> </html>