aboutsummaryrefslogtreecommitdiffhomepage
path: root/print.html
diff options
context:
space:
mode:
Diffstat (limited to 'print.html')
-rw-r--r--print.html2041
1 files changed, 1079 insertions, 962 deletions
diff --git a/print.html b/print.html
index 2e481d9..10abf84 100644
--- a/print.html
+++ b/print.html
@@ -89,7 +89,7 @@
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div class="sidebar-scrollbox">
- <ol class="chapter"><li class="chapter-item expanded affix "><a href="intro.html">Introduction</a></li><li class="chapter-item expanded "><a href="tools/index.html"><strong aria-hidden="true">1.</strong> Tools</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="tools/zsh.html"><strong aria-hidden="true">1.1.</strong> zsh</a></li><li class="chapter-item expanded "><a href="tools/bash.html"><strong aria-hidden="true">1.2.</strong> bash</a></li><li class="chapter-item expanded "><a href="tools/fish.html"><strong aria-hidden="true">1.3.</strong> fish</a></li><li class="chapter-item expanded "><a href="tools/tmux.html"><strong aria-hidden="true">1.4.</strong> tmux</a></li><li class="chapter-item expanded "><a href="tools/git.html"><strong aria-hidden="true">1.5.</strong> git</a></li><li class="chapter-item expanded "><a href="tools/awk.html"><strong aria-hidden="true">1.6.</strong> awk</a></li><li class="chapter-item expanded "><a href="tools/emacs.html"><strong aria-hidden="true">1.7.</strong> emacs</a></li><li class="chapter-item expanded "><a href="tools/gpg.html"><strong aria-hidden="true">1.8.</strong> gpg</a></li><li class="chapter-item expanded "><a href="tools/gdb.html"><strong aria-hidden="true">1.9.</strong> gdb</a></li><li class="chapter-item expanded "><a href="tools/gdbserver.html"><strong aria-hidden="true">1.10.</strong> gdbserver</a></li><li class="chapter-item expanded "><a href="tools/radare2.html"><strong aria-hidden="true">1.11.</strong> radare2</a></li><li class="chapter-item expanded "><a href="tools/qemu.html"><strong aria-hidden="true">1.12.</strong> qemu</a></li><li class="chapter-item expanded "><a href="tools/pacman.html"><strong aria-hidden="true">1.13.</strong> pacman</a></li><li class="chapter-item expanded "><a href="tools/dot.html"><strong aria-hidden="true">1.14.</strong> dot</a></li><li class="chapter-item expanded "><a href="tools/ffmpeg.html"><strong aria-hidden="true">1.15.</strong> ffmpeg</a></li><li class="chapter-item expanded "><a href="tools/column.html"><strong aria-hidden="true">1.16.</strong> column</a></li><li class="chapter-item expanded "><a href="tools/sort.html"><strong aria-hidden="true">1.17.</strong> sort</a></li><li class="chapter-item expanded "><a href="tools/sed.html"><strong aria-hidden="true">1.18.</strong> sed</a></li><li class="chapter-item expanded "><a href="tools/gnuplot.html"><strong aria-hidden="true">1.19.</strong> gnuplot</a></li></ol></li><li class="chapter-item expanded "><a href="monitor/index.html"><strong aria-hidden="true">2.</strong> Resource analysis & monitor</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="monitor/lsof.html"><strong aria-hidden="true">2.1.</strong> lsof</a></li><li class="chapter-item expanded "><a href="monitor/ss.html"><strong aria-hidden="true">2.2.</strong> ss</a></li><li class="chapter-item expanded "><a href="monitor/pidstat.html"><strong aria-hidden="true">2.3.</strong> pidstat</a></li><li class="chapter-item expanded "><a href="monitor/pgrep.html"><strong aria-hidden="true">2.4.</strong> pgrep</a></li><li class="chapter-item expanded "><a href="monitor/ps.html"><strong aria-hidden="true">2.5.</strong> ps</a></li><li class="chapter-item expanded "><a href="monitor/pmap.html"><strong aria-hidden="true">2.6.</strong> pmap</a></li><li class="chapter-item expanded "><a href="monitor/pstack.html"><strong aria-hidden="true">2.7.</strong> pstack</a></li></ol></li><li class="chapter-item expanded "><a href="trace_profile/index.html"><strong aria-hidden="true">3.</strong> Trace and Profile</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="trace_profile/time.html"><strong aria-hidden="true">3.1.</strong> time</a></li><li class="chapter-item expanded "><a href="trace_profile/strace.html"><strong aria-hidden="true">3.2.</strong> strace</a></li><li class="chapter-item expanded "><a href="trace_profile/ltrace.html"><strong aria-hidden="true">3.3.</strong> ltrace</a></li><li class="chapter-item expanded "><a href="trace_profile/perf.html"><strong aria-hidden="true">3.4.</strong> perf</a></li><li class="chapter-item expanded "><a href="trace_profile/oprofile.html"><strong aria-hidden="true">3.5.</strong> OProfile</a></li><li class="chapter-item expanded "><a href="trace_profile/callgrind.html"><strong aria-hidden="true">3.6.</strong> callgrind</a></li></ol></li><li class="chapter-item expanded "><a href="binary/index.html"><strong aria-hidden="true">4.</strong> Binary</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="binary/od.html"><strong aria-hidden="true">4.1.</strong> od</a></li><li class="chapter-item expanded "><a href="binary/xxd.html"><strong aria-hidden="true">4.2.</strong> xxd</a></li><li class="chapter-item expanded "><a href="binary/readelf.html"><strong aria-hidden="true">4.3.</strong> readelf</a></li><li class="chapter-item expanded "><a href="binary/objdump.html"><strong aria-hidden="true">4.4.</strong> objdump</a></li><li class="chapter-item expanded "><a href="binary/nm.html"><strong aria-hidden="true">4.5.</strong> nm</a></li></ol></li><li class="chapter-item expanded "><a href="development/index.html"><strong aria-hidden="true">5.</strong> Development</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="development/c++filt.html"><strong aria-hidden="true">5.1.</strong> c++filt</a></li><li class="chapter-item expanded "><a href="development/c++.html"><strong aria-hidden="true">5.2.</strong> c++</a></li><li class="chapter-item expanded "><a href="development/glibc.html"><strong aria-hidden="true">5.3.</strong> glibc</a></li><li class="chapter-item expanded "><a href="development/gcc.html"><strong aria-hidden="true">5.4.</strong> gcc</a></li><li class="chapter-item expanded "><a href="development/cmake.html"><strong aria-hidden="true">5.5.</strong> cmake</a></li><li class="chapter-item expanded "><a href="development/make.html"><strong aria-hidden="true">5.6.</strong> make</a></li><li class="chapter-item expanded "><a href="development/ld.so.html"><strong aria-hidden="true">5.7.</strong> ld.so</a></li><li class="chapter-item expanded "><a href="development/symbolver.html"><strong aria-hidden="true">5.8.</strong> symbol versioning</a></li><li class="chapter-item expanded "><a href="development/python.html"><strong aria-hidden="true">5.9.</strong> python</a></li><li class="chapter-item expanded "><a href="development/gcov.html"><strong aria-hidden="true">5.10.</strong> gcov</a></li><li class="chapter-item expanded "><a href="development/pgo.html"><strong aria-hidden="true">5.11.</strong> pgo</a></li></ol></li><li class="chapter-item expanded "><a href="linux/index.html"><strong aria-hidden="true">6.</strong> Linux</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="linux/systemd.html"><strong aria-hidden="true">6.1.</strong> systemd</a></li><li class="chapter-item expanded "><a href="linux/coredump.html"><strong aria-hidden="true">6.2.</strong> coredump</a></li><li class="chapter-item expanded "><a href="linux/ptrace_scope.html"><strong aria-hidden="true">6.3.</strong> ptrace_scope</a></li><li class="chapter-item expanded "><a href="linux/cryptsetup.html"><strong aria-hidden="true">6.4.</strong> cryptsetup</a></li><li class="chapter-item expanded "><a href="linux/swap.html"><strong aria-hidden="true">6.5.</strong> swap</a></li><li class="chapter-item expanded "><a href="linux/input.html"><strong aria-hidden="true">6.6.</strong> input</a></li><li class="chapter-item expanded "><a href="linux/acl.html"><strong aria-hidden="true">6.7.</strong> acl</a></li><li class="chapter-item expanded "><a href="linux/zfs.html"><strong aria-hidden="true">6.8.</strong> zfs</a></li></ol></li><li class="chapter-item expanded "><a href="network/index.html"><strong aria-hidden="true">7.</strong> Network</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="network/tcpdump.html"><strong aria-hidden="true">7.1.</strong> tcpdump</a></li><li class="chapter-item expanded "><a href="network/tshark.html"><strong aria-hidden="true">7.2.</strong> tshark</a></li><li class="chapter-item expanded "><a href="network/firewall-cmd.html"><strong aria-hidden="true">7.3.</strong> firewall-cmd</a></li><li class="chapter-item expanded "><a href="network/nftables.html"><strong aria-hidden="true">7.4.</strong> nftables</a></li></ol></li><li class="chapter-item expanded "><a href="web/index.html"><strong aria-hidden="true">8.</strong> Web</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="web/html.html"><strong aria-hidden="true">8.1.</strong> html</a></li><li class="chapter-item expanded "><a href="web/css.html"><strong aria-hidden="true">8.2.</strong> css</a></li><li class="chapter-item expanded "><a href="web/chartjs.html"><strong aria-hidden="true">8.3.</strong> chartjs</a></li></ol></li><li class="chapter-item expanded "><a href="arch/index.html"><strong aria-hidden="true">9.</strong> Arch</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="arch/x86_64.html"><strong aria-hidden="true">9.1.</strong> x86_64</a></li><li class="chapter-item expanded "><a href="arch/arm64.html"><strong aria-hidden="true">9.2.</strong> arm64</a></li><li class="chapter-item expanded "><a href="arch/armv7.html"><strong aria-hidden="true">9.3.</strong> armv7</a></li><li class="chapter-item expanded "><a href="arch/riscv.html"><strong aria-hidden="true">9.4.</strong> riscv</a></li></ol></li></ol>
+ <ol class="chapter"><li class="chapter-item expanded affix "><a href="intro.html">Introduction</a></li><li class="chapter-item expanded "><a href="shells/index.html"><strong aria-hidden="true">1.</strong> Shells</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="shells/zsh.html"><strong aria-hidden="true">1.1.</strong> zsh</a></li><li class="chapter-item expanded "><a href="shells/bash.html"><strong aria-hidden="true">1.2.</strong> bash</a></li><li class="chapter-item expanded "><a href="shells/fish.html"><strong aria-hidden="true">1.3.</strong> fish</a></li></ol></li><li class="chapter-item expanded "><a href="cli/index.html"><strong aria-hidden="true">2.</strong> CLI foo</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="cli/awk.html"><strong aria-hidden="true">2.1.</strong> awk</a></li><li class="chapter-item expanded "><a href="cli/sed.html"><strong aria-hidden="true">2.2.</strong> sed</a></li><li class="chapter-item expanded "><a href="cli/column.html"><strong aria-hidden="true">2.3.</strong> column</a></li><li class="chapter-item expanded "><a href="cli/sort.html"><strong aria-hidden="true">2.4.</strong> sort</a></li><li class="chapter-item expanded "><a href="cli/tr.html"><strong aria-hidden="true">2.5.</strong> tr</a></li></ol></li><li class="chapter-item expanded "><a href="tools/index.html"><strong aria-hidden="true">3.</strong> Tools</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="tools/tmux.html"><strong aria-hidden="true">3.1.</strong> tmux</a></li><li class="chapter-item expanded "><a href="tools/emacs.html"><strong aria-hidden="true">3.2.</strong> emacs</a></li><li class="chapter-item expanded "><a href="tools/gpg.html"><strong aria-hidden="true">3.3.</strong> gpg</a></li><li class="chapter-item expanded "><a href="tools/radare2.html"><strong aria-hidden="true">3.4.</strong> radare2</a></li><li class="chapter-item expanded "><a href="tools/qemu.html"><strong aria-hidden="true">3.5.</strong> qemu</a></li><li class="chapter-item expanded "><a href="tools/pacman.html"><strong aria-hidden="true">3.6.</strong> pacman</a></li><li class="chapter-item expanded "><a href="tools/dot.html"><strong aria-hidden="true">3.7.</strong> dot</a></li><li class="chapter-item expanded "><a href="tools/ffmpeg.html"><strong aria-hidden="true">3.8.</strong> ffmpeg</a></li><li class="chapter-item expanded "><a href="tools/gnuplot.html"><strong aria-hidden="true">3.9.</strong> gnuplot</a></li><li class="chapter-item expanded "><a href="tools/restic.html"><strong aria-hidden="true">3.10.</strong> restic</a></li></ol></li><li class="chapter-item expanded "><a href="monitor/index.html"><strong aria-hidden="true">4.</strong> Resource analysis & monitor</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="monitor/lsof.html"><strong aria-hidden="true">4.1.</strong> lsof</a></li><li class="chapter-item expanded "><a href="monitor/pidstat.html"><strong aria-hidden="true">4.2.</strong> pidstat</a></li><li class="chapter-item expanded "><a href="monitor/pgrep.html"><strong aria-hidden="true">4.3.</strong> pgrep</a></li><li class="chapter-item expanded "><a href="monitor/ps.html"><strong aria-hidden="true">4.4.</strong> ps</a></li><li class="chapter-item expanded "><a href="monitor/pmap.html"><strong aria-hidden="true">4.5.</strong> pmap</a></li><li class="chapter-item expanded "><a href="monitor/pstack.html"><strong aria-hidden="true">4.6.</strong> pstack</a></li></ol></li><li class="chapter-item expanded "><a href="trace_profile/index.html"><strong aria-hidden="true">5.</strong> Trace and Profile</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="trace_profile/time.html"><strong aria-hidden="true">5.1.</strong> time</a></li><li class="chapter-item expanded "><a href="trace_profile/strace.html"><strong aria-hidden="true">5.2.</strong> strace</a></li><li class="chapter-item expanded "><a href="trace_profile/ltrace.html"><strong aria-hidden="true">5.3.</strong> ltrace</a></li><li class="chapter-item expanded "><a href="trace_profile/perf.html"><strong aria-hidden="true">5.4.</strong> perf</a></li><li class="chapter-item expanded "><a href="trace_profile/oprofile.html"><strong aria-hidden="true">5.5.</strong> OProfile</a></li><li class="chapter-item expanded "><a href="trace_profile/callgrind.html"><strong aria-hidden="true">5.6.</strong> callgrind</a></li></ol></li><li class="chapter-item expanded "><a href="debug/index.html"><strong aria-hidden="true">6.</strong> Debug</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="debug/gdb.html"><strong aria-hidden="true">6.1.</strong> gdb</a></li><li class="chapter-item expanded "><a href="debug/gdbserver.html"><strong aria-hidden="true">6.2.</strong> gdbserver</a></li></ol></li><li class="chapter-item expanded "><a href="binary/index.html"><strong aria-hidden="true">7.</strong> Binary</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="binary/od.html"><strong aria-hidden="true">7.1.</strong> od</a></li><li class="chapter-item expanded "><a href="binary/xxd.html"><strong aria-hidden="true">7.2.</strong> xxd</a></li><li class="chapter-item expanded "><a href="binary/readelf.html"><strong aria-hidden="true">7.3.</strong> readelf</a></li><li class="chapter-item expanded "><a href="binary/objdump.html"><strong aria-hidden="true">7.4.</strong> objdump</a></li><li class="chapter-item expanded "><a href="binary/nm.html"><strong aria-hidden="true">7.5.</strong> nm</a></li></ol></li><li class="chapter-item expanded "><a href="development/index.html"><strong aria-hidden="true">8.</strong> Development</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="development/c++filt.html"><strong aria-hidden="true">8.1.</strong> c++filt</a></li><li class="chapter-item expanded "><a href="development/c++.html"><strong aria-hidden="true">8.2.</strong> c++</a></li><li class="chapter-item expanded "><a href="development/glibc.html"><strong aria-hidden="true">8.3.</strong> glibc</a></li><li class="chapter-item expanded "><a href="development/gcc.html"><strong aria-hidden="true">8.4.</strong> gcc</a></li><li class="chapter-item expanded "><a href="development/git.html"><strong aria-hidden="true">8.5.</strong> git</a></li><li class="chapter-item expanded "><a href="development/cmake.html"><strong aria-hidden="true">8.6.</strong> cmake</a></li><li class="chapter-item expanded "><a href="development/make.html"><strong aria-hidden="true">8.7.</strong> make</a></li><li class="chapter-item expanded "><a href="development/ld.so.html"><strong aria-hidden="true">8.8.</strong> ld.so</a></li><li class="chapter-item expanded "><a href="development/symbolver.html"><strong aria-hidden="true">8.9.</strong> symbol versioning</a></li><li class="chapter-item expanded "><a href="development/python.html"><strong aria-hidden="true">8.10.</strong> python</a></li><li class="chapter-item expanded "><a href="development/gcov.html"><strong aria-hidden="true">8.11.</strong> gcov</a></li><li class="chapter-item expanded "><a href="development/pgo.html"><strong aria-hidden="true">8.12.</strong> pgo</a></li></ol></li><li class="chapter-item expanded "><a href="linux/index.html"><strong aria-hidden="true">9.</strong> Linux</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="linux/systemd.html"><strong aria-hidden="true">9.1.</strong> systemd</a></li><li class="chapter-item expanded "><a href="linux/coredump.html"><strong aria-hidden="true">9.2.</strong> coredump</a></li><li class="chapter-item expanded "><a href="linux/ptrace_scope.html"><strong aria-hidden="true">9.3.</strong> ptrace_scope</a></li><li class="chapter-item expanded "><a href="linux/cryptsetup.html"><strong aria-hidden="true">9.4.</strong> cryptsetup</a></li><li class="chapter-item expanded "><a href="linux/swap.html"><strong aria-hidden="true">9.5.</strong> swap</a></li><li class="chapter-item expanded "><a href="linux/input.html"><strong aria-hidden="true">9.6.</strong> input</a></li><li class="chapter-item expanded "><a href="linux/acl.html"><strong aria-hidden="true">9.7.</strong> acl</a></li><li class="chapter-item expanded "><a href="linux/zfs.html"><strong aria-hidden="true">9.8.</strong> zfs</a></li></ol></li><li class="chapter-item expanded "><a href="network/index.html"><strong aria-hidden="true">10.</strong> Network</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="network/ss.html"><strong aria-hidden="true">10.1.</strong> ss</a></li><li class="chapter-item expanded "><a href="network/tcpdump.html"><strong aria-hidden="true">10.2.</strong> tcpdump</a></li><li class="chapter-item expanded "><a href="network/tshark.html"><strong aria-hidden="true">10.3.</strong> tshark</a></li><li class="chapter-item expanded "><a href="network/firewall-cmd.html"><strong aria-hidden="true">10.4.</strong> firewall-cmd</a></li><li class="chapter-item expanded "><a href="network/nftables.html"><strong aria-hidden="true">10.5.</strong> nftables</a></li></ol></li><li class="chapter-item expanded "><a href="web/index.html"><strong aria-hidden="true">11.</strong> Web</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="web/html.html"><strong aria-hidden="true">11.1.</strong> html</a></li><li class="chapter-item expanded "><a href="web/css.html"><strong aria-hidden="true">11.2.</strong> css</a></li><li class="chapter-item expanded "><a href="web/chartjs.html"><strong aria-hidden="true">11.3.</strong> chartjs</a></li></ol></li><li class="chapter-item expanded "><a href="arch/index.html"><strong aria-hidden="true">12.</strong> Arch</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="arch/x86_64.html"><strong aria-hidden="true">12.1.</strong> x86_64</a></li><li class="chapter-item expanded "><a href="arch/armv8.html"><strong aria-hidden="true">12.2.</strong> armv8</a></li><li class="chapter-item expanded "><a href="arch/arm64.html"><strong aria-hidden="true">12.3.</strong> arm64</a></li><li class="chapter-item expanded "><a href="arch/armv7.html"><strong aria-hidden="true">12.4.</strong> armv7</a></li><li class="chapter-item expanded "><a href="arch/riscv.html"><strong aria-hidden="true">12.5.</strong> riscv</a></li></ol></li></ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
<div class="sidebar-resize-indicator"></div>
@@ -180,27 +180,11 @@
<h1 id="notes"><a class="header" href="#notes">Notes</a></h1>
<p>A personal collection of notes and cheatsheets.</p>
<p>Source code is located at <a href="https://github.com/johannst/notes">johannst/notes</a>.</p>
-<div style="break-before: page; page-break-before: always;"></div><h1 id="tools"><a class="header" href="#tools">Tools</a></h1>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="shells"><a class="header" href="#shells">Shells</a></h1>
<ul>
-<li><a href="tools/./zsh.html">zsh</a></li>
-<li><a href="tools/./bash.html">bash</a></li>
-<li><a href="tools/./fish.html">fish</a></li>
-<li><a href="tools/./tmux.html">tmux</a></li>
-<li><a href="tools/./git.html">git</a></li>
-<li><a href="tools/./awk.html">awk</a></li>
-<li><a href="tools/./emacs.html">emacs</a></li>
-<li><a href="tools/./gpg.html">gpg</a></li>
-<li><a href="tools/./gdb.html">gdb</a></li>
-<li><a href="tools/./gdbserver.html">gdbserver</a></li>
-<li><a href="tools/./radare2.html">radare2</a></li>
-<li><a href="tools/./qemu.html">qemu</a></li>
-<li><a href="tools/./pacman.html">pacman</a></li>
-<li><a href="tools/./dot.html">dot</a></li>
-<li><a href="tools/./ffmpeg.html">ffmpeg</a></li>
-<li><a href="tools/./column.html">column</a></li>
-<li><a href="tools/./sort.html">sort</a></li>
-<li><a href="tools/./sed.html">sed</a></li>
-<li><a href="tools/./gnuplot.html">gnuplot</a></li>
+<li><a href="shells/./zsh.html">zsh</a></li>
+<li><a href="shells/./bash.html">bash</a></li>
+<li><a href="shells/./fish.html">fish</a></li>
</ul>
<div style="break-before: page; page-break-before: always;"></div><h1 id="zsh1"><a class="header" href="#zsh1">zsh(1)</a></h1>
<h2 id="keybindings"><a class="header" href="#keybindings">Keybindings</a></h2>
@@ -337,7 +321,7 @@ echo ${(kv)vec} # a aa b bb
for k v in ${(kv)vec)}; do ...; done
</code></pre>
<h2 id="io-redirections"><a class="header" href="#io-redirections">I/O redirections</a></h2>
-<p>See <a href="tools/bash.html#io-redirection">bash - I/O redirection</a></p>
+<p>See <a href="shells/bash.html#io-redirection">bash - I/O redirection</a></p>
<h2 id="process-substitution"><a class="header" href="#process-substitution">Process substitution</a></h2>
<p>Process substitution allows to redirect the stdout of multiple processes at
once.</p>
@@ -548,7 +532,7 @@ NAME=VAR2
printf -v "$NAME" "%s" "def"
</code></pre>
<blockquote>
-<p>Note: <code>prefix</code>/<code>suffix</code>/<code>pattern</code> are expanded as <a href="tools/bash.html#pathname">pathnames</a>.</p>
+<p>Note: <code>prefix</code>/<code>suffix</code>/<code>pattern</code> are expanded as <a href="shells/bash.html#pathname">pathnames</a>.</p>
</blockquote>
<h3 id="pathname"><a class="header" href="#pathname">Pathname</a></h3>
<pre><code class="language-bash">* match any string
@@ -970,302 +954,14 @@ status -f # abs path of current file
breakpoint ................ halt script execution and gives shell (C-d | exit
to continue)
</code></pre>
-<div style="break-before: page; page-break-before: always;"></div><h1 id="tmux1"><a class="header" href="#tmux1">tmux(1)</a></h1>
-<p>Terminology:</p>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="cli-foo"><a class="header" href="#cli-foo">CLI foo</a></h1>
<ul>
-<li><code>session</code> is a collection of pseudo terminals which can have multiple
-<code>windows</code></li>
-<li><code>window</code> uses the entire screen and can be split into rectangular <code>panes</code></li>
-<li><code>pane</code> is a single pseudo terminal instance</li>
+<li><a href="cli/./awk.html">awk</a></li>
+<li><a href="cli/./sed.html">sed</a></li>
+<li><a href="cli/./column.html">column</a></li>
+<li><a href="cli/./sort.html">sort</a></li>
+<li><a href="cli/./tr.html">tr</a></li>
</ul>
-<h1 id="tmux-cli"><a class="header" href="#tmux-cli">Tmux cli</a></h1>
-<pre><code class="language-markdown"># Session
-tmux creates new session
-tmux ls list running sessions
-tmux kill-session -t &lt;s&gt; kill running session &lt;s&gt;
-tmux attach -t &lt;s&gt; [-d] attach to session &lt;s&gt;, detach other clients [-d]
-tmux detach -s &lt;s&gt; detach all clients from session &lt;s&gt;
-
-# Environment
-tmux showenv -g show global tmux environment variables
-tmux setenv -g &lt;var&gt; &lt;val&gt; set variable in global tmux env
-
-# Misc
-tmux source-file &lt;file&gt; source config &lt;file&gt;
-tmux lscm list available tmux commnds
-tmux show -g show global tmux options
-tmux display &lt;msg&gt; display message in tmux status line
-</code></pre>
-<h2 id="scripting"><a class="header" href="#scripting">Scripting</a></h2>
-<pre><code class="language-markdown"># Session
-tmux list-sessions -F '#S' list running sessions, only IDs
-
-# Window
-tmux list-windows -F '#I' -t &lt;s&gt; list window IDs for session &lt;s&gt;
-tmux selectw -t &lt;s&gt;:&lt;w&gt; select window &lt;w&gt; in session &lt;s&gt;
-
-# Pane
-tmux list-panes -F '#P' -t &lt;s&gt;:&lt;w&gt; list pane IDs for window &lt;w&gt; in session &lt;s&gt;
-tmux selectp -t &lt;s&gt;:&lt;w&gt;.&lt;p&gt; select pane &lt;p&gt; in window &lt;w&gt; in session &lt;s&gt;
-
-# Run commands
-tmux send -t &lt;s&gt;:&lt;w&gt;.&lt;p&gt; "ls" C-m send cmds/keys to pane
-tmux run -t &lt;p&gt; &lt;sh-cmd&gt; run shell command &lt;sh-cmd&gt; in background and report output on pane -t &lt;p&gt;
-</code></pre>
-<p>For example cycle through all panes in all windows in all sessions:</p>
-<pre><code class="language-bash"># bash
-for s in $(tmux list-sessions -F '#S'); do
- for w in $(tmux list-windows -F '#I' -t $s); do
- for p in $(tmux list-panes -F '#P' -t $s:$w); do
- echo $s:$w.$p
- done
- done
-done
-</code></pre>
-<h1 id="bindings"><a class="header" href="#bindings">Bindings</a></h1>
-<pre><code class="language-markdown">prefix d detach from current session
-prefix c create new window
-prefix w open window list
-prefix $ rename session
-prefix , rename window
-prefix . move current window
-</code></pre>
-<p>Following bindings are specific to my <a href="https://github.com/johannst/dotfiles/blob/master/tmux.conf"><code>tmux.conf</code></a>:</p>
-<pre><code class="language-markdown">C-s prefix
-
-# Panes
-prefix s horizontal split
-prefix v vertical split
-prefix f toggle maximize/minimize current pane
-
-# Movement
-prefix Tab toggle between window
-
-prefix h move to pane left
-prefix j move to pane down
-prefix k move to pane up
-prefix l move to pane right
-
-# Resize
-prefix C-h resize pane left
-prefix C-j resize pane down
-prefix C-k resize pane up
-prefix C-l resize pane right
-
-# Copy/Paste
-prefix C-v enter copy mode
-prefix C-p paste yanked text
-prefix C-b open copy-buffer list
-
-# In Copy Mode
-v enable visual mode
-y yank selected text
-</code></pre>
-<h1 id="command-mode"><a class="header" href="#command-mode">Command mode</a></h1>
-<p>To enter command mode <code>prefix :</code>.</p>
-<p>Some useful commands are:</p>
-<pre><code class="language-markdown">setw synchronize-panes on/off enables/disables synchronized input to all panes
-list-keys -t vi-copy list keymaps for vi-copy mode
-</code></pre>
-<div style="break-before: page; page-break-before: always;"></div><h1 id="git1"><a class="header" href="#git1">git(1)</a></h1>
-<h2 id="working-areas"><a class="header" href="#working-areas">Working areas</a></h2>
-<pre><code class="language-text">+-------------------+ --- stash -----&gt; +-------+
-| working directory | | stash | // Shelving area.
-+-------------------+ &lt;-- stash pop -- +-------+
- | ^
- add |
- | reset
- v |
-+-------------------+
-| staging area |
-+-------------------+
- |
- commit
- |
- v
-+-------------------+
-| local repository |
-+-------------------+
- | ^
- push |
- | fetch /
- | pull
- v |
-+-------------------+
-| remote repository |
-+-------------------+
-</code></pre>
-<h2 id="config"><a class="header" href="#config">Config</a></h2>
-<pre><code class="language-markdown"> git config --list --show-origin ..... list currently set configs and where
- they are coming from
- git --edit [--global] ............... open config in editor (local or global)
-</code></pre>
-<h2 id="clean"><a class="header" href="#clean">Clean</a></h2>
-<pre><code class="language-markdown"> git clean -X ......... remove only ignored files (-n for dry run)
- git clean -f -d -x ... remove untracked &amp; ignored files / folders
- git clean -e &lt;pat&gt; ... exclude pattern from deletion
-</code></pre>
-<h2 id="staging"><a class="header" href="#staging">Staging</a></h2>
-<pre><code class="language-markdown"> git add -p [&lt;file&gt;] ............ partial staging (interactive)
-</code></pre>
-<h2 id="remote"><a class="header" href="#remote">Remote</a></h2>
-<pre><code class="language-markdown"> git remote -v .................. list remotes verbose (with URLs)
- git remote show [-n] &lt;remote&gt; .. list info for &lt;remote&gt; (like remote HEAD,
- remote branches, tracking mapping)
-</code></pre>
-<h2 id="branching"><a class="header" href="#branching">Branching</a></h2>
-<pre><code class="language-markdown"> git branch [-a] ................ list available branches; -a to include
- remote branches
- git branch -vv ................. list branch &amp; annotate with head sha1 &amp;
- remote tracking branch
- git branch &lt;bname&gt; ............. create local branch with name &lt;bname&gt;
- git branch -d &lt;bname&gt; .......... delete local branch with name &lt;bname&gt;
- git checkout &lt;bname&gt; ........... switch to branch with name &lt;bname&gt;
- git checkout --track &lt;branch&gt; .. start to locally track a remote branch
- git branch --unset-upstream .... unset remote tracking branch
-
- # Remote
-
- git push -u origin &lt;rbname&gt; ........ push local branch to origin (or other
- remote), and setup &lt;rbname&gt; as tracking
- branch
- git push origin --delete &lt;rbname&gt; .. delete branch &lt;rbname&gt; from origin (or
- other remote)
-</code></pre>
-<h2 id="update-local-from-remote"><a class="header" href="#update-local-from-remote">Update local from remote</a></h2>
-<pre><code class="language-markdown"> git fetch --prune .................. update all remote references and
- remove delete non-existing ones
- (does not merge into local tracking branch)
- git pull [--rebase] ................ fetch remote references and merge into
- local tracking branch (fast-forward by default).
- Optionally rebase local tracking branch
- on-top of remote branch (in case local
- branch has additional commits compared to remote branch).
-</code></pre>
-<h2 id="tags"><a class="header" href="#tags">Tags</a></h2>
-<pre><code class="language-markdown"> git tag -a &lt;tname&gt; -m "descr" ........ creates an annotated tag (full object
- containing tagger, date, ...)
- git tag -l ........................... list available tags
- git checkout tag/&lt;tname&gt; ............. checkout specific tag
- git checkout tag/&lt;tname&gt; -b &lt;bname&gt; .. checkout specific tag in a new branch
-
- # Remote
-
- git push origin --tags .... push local tags to origin (or other remote)
-</code></pre>
-<h2 id="merging"><a class="header" href="#merging">Merging</a></h2>
-<pre><code class="language-markdown"> git merge [opt] &lt;commit&gt; .... integrate changes from &lt;commit&gt; since
- opt: current branch and &lt;commit&gt; diverged
- --squash ................ merge all commits into a single one
- --no-commit ............. dont generate commit if the merge succeeds
-
- git merge-base &lt;commit&gt; &lt;commit&gt;
- get the common ancestor, since both commits diverged
-
- git rebase -i &lt;upstream&gt; .... interactively rebase on &lt;upstream&gt;, also supports actions
- like squashing, editing, rewording, etc of commits
-
- git cherry-pick &lt;commit&gt; .... apply commit on current branch
-</code></pre>
-<h2 id="worktree"><a class="header" href="#worktree">Worktree</a></h2>
-<p>Worktrees allow to maintain multiple working trees in the filesystem linked to
-the same repository (shared .git folder).</p>
-<pre><code class="language-markdown"> git worktree add &lt;path&gt; .............. create a tree at &lt;path&gt; with a new branch
- checked out (bname is basename of &lt;path&gt;)
- git worktree add &lt;path&gt; &lt;bname&gt; ...... create a tree at &lt;path&gt; from existing &lt;bname&gt;
- git worktree list .................... list existing work trees
- git worktree remove &lt;tree&gt; ........... remove work tree
- git worktree prune ................... remove stale bookkeeping files
-</code></pre>
-<h2 id="log--commit-history"><a class="header" href="#log--commit-history">Log &amp; Commit History</a></h2>
-<pre><code class="language-markdown"> git log --oneline ......... shows log in single line per commit -&gt; alias for
- '--pretty=oneline --abbrev-commit'
- git log --graph ........... text based graph of commit history
- git log --decorate ........ decorate log with REFs
-
- git log -p &lt;file&gt; ......... show commit history + diffs for &lt;file&gt;
- git log --oneline &lt;file&gt; .. show commit history for &lt;file&gt; in compact format
-</code></pre>
-<h2 id="diff--commit-info"><a class="header" href="#diff--commit-info">Diff &amp; Commit Info</a></h2>
-<pre><code class="language-markdown"> git diff &lt;commit&gt;..&lt;commit&gt; [&lt;file&gt;] .... show changes between two arbitrary
- commits. If one &lt;commit&gt; is omitted
- it is if HEAD is specified.
- git diff --name-only &lt;commit&gt;..&lt;commit&gt; . show names of files changed
- git diff -U$(wc -l &lt;file&gt;) &lt;file&gt; ....... shows complete file with diffs
- instead of usual diff snippets
- git diff --staged ....................... show diffs of staged files
-
- git show --stat &lt;commit&gt; ................ show files changed by &lt;commit&gt;
- git show &lt;commit&gt; [&lt;file&gt;] .............. show diffs for &lt;commit&gt;
-
- git show &lt;commit&gt;:&lt;file&gt; ................ show &lt;file&gt; at &lt;commit&gt;
-</code></pre>
-<h2 id="patching"><a class="header" href="#patching">Patching</a></h2>
-<pre><code class="language-markdown"> git format-patch &lt;opt&gt; &lt;since&gt;/&lt;revision range&gt;
- opt:
- -N ................... use [PATCH] instead [PATCH n/m] in subject when
- generating patch description (for patches spanning
- multiple commits)
- --start-number &lt;n&gt; ... start output file generation with &lt;n&gt; as start
- number instead '1'
- since spcifier:
- -3 .................. e.g: create a patch from last three commits
- &lt;commit hash&gt; ....... create patch with commits starting after &lt;commit hash&gt;
-
- git am &lt;patch&gt; ......... apply patch and create a commit for it
-
- git apply --stat &lt;PATCH&gt; ... see which files the patch would change
- git apply --check &lt;PATCH&gt; .. see if the patch can be applied cleanly
- git apply [-3] &lt;PATCH&gt; ..... apply the patch locally without creating a commit,
- if the patch does not cleanly apply -3 allows for
- a 3-way merge
-
- # eg: generate patches for each commit from initial commit on
- git format-patch -N $(git rev-list --max-parents=0 HEAD)
-
- # generate single patch file from a certain commit/ref
- git format-patch &lt;COMMIT/REF&gt; --stdout &gt; my-patch.patch
-</code></pre>
-<h2 id="resetting"><a class="header" href="#resetting">Resetting</a></h2>
-<pre><code class="language-markdown"> git reset [opt] &lt;ref|commit&gt;
- opt:
- --mixed .................... resets index, but not working tree
- --hard ..................... matches the working tree and index to that
- of the tree being switched to any changes to
- tracked files in the working tree since
- &lt;commit&gt; are lost
- git reset HEAD &lt;file&gt; .......... remove file from staging
- git reset --soft HEAD~1 ........ delete most recent commit but keep work
- git reset --hard HEAD~1 ........ delete most recent commit and delete work
-</code></pre>
-<h2 id="submodules"><a class="header" href="#submodules">Submodules</a></h2>
-<pre><code class="language-markdown"> git submodule add &lt;url&gt; [&lt;path&gt;] .......... add new submodule to current project
- git clone --recursive &lt;url&gt; ............... clone project and recursively all
- submodules (same as using
- 'git submodule update --init
- --recursive' after clone)
- git submodule update --init --recursive ... checkout submodules recursively
- using the commit listed in the
- super-project (in detached HEAD)
- git submodule update --remote &lt;submod&gt; .... fetch &amp; merge remote changes for
- &lt;submod&gt;, this will pull
- origin/HEAD or a branch specified
- for the submodule
- git diff --submodule ...................... show commits that are part of the
- submodule diff
-</code></pre>
-<h2 id="inspection"><a class="header" href="#inspection">Inspection</a></h2>
-<pre><code class="language-markdown"> git ls-tree [-r] &lt;ref&gt; .... show git tree for &lt;ref&gt;, -r to recursively ls sub-trees
- git show &lt;obj&gt; ............ show &lt;obj&gt;
- git cat-file -p &lt;obj&gt; ..... print content of &lt;obj&gt;
-</code></pre>
-<h2 id="revision-specifier"><a class="header" href="#revision-specifier">Revision Specifier</a></h2>
-<pre><code class="language-markdown"> HEAD ........ last commit
- HEAD~1 ...... last commit-1
- HEAD~N ...... last commit-N (linear backwards when in tree structure, check
- difference between HEAD^ and HEAD~)
- git rev-list --max-parents=0 HEAD ........... first commit
-</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="awk1"><a class="header" href="#awk1">awk(1)</a></h1>
<pre><code class="language-markdown">awk [opt] program [input]
-F &lt;sepstr&gt; field separator string (can be regex)
@@ -1439,6 +1135,273 @@ At the <code>END</code> we compute the average of each key.</p>
</code></pre>
<p>We build a <code>ps</code> command line and capture the first line of the processes output
in the <code>user</code> variable and then print it.</p>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="sed1"><a class="header" href="#sed1">sed(1)</a></h1>
+<pre><code>sed [opts] [script] [file]
+ opts:
+ -i edit file in place
+ -i.bk edit file in place and create backup file
+ (with .bk suffix, can be specified differently)
+ --follow-symlinks
+ follow symlinks when editing in place
+ -e SCRIPT add SCRIPT to commands to be executed
+ (can be specified multiple times)
+ -f FILE add content of FILE to command to be executed
+
+ --debug annotate program execution
+</code></pre>
+<h2 id="examples-1"><a class="header" href="#examples-1">Examples</a></h2>
+<h3 id="delete-lines"><a class="header" href="#delete-lines">Delete lines</a></h3>
+<pre><code class="language-sh"># Delete two lines.
+echo -e 'aa\nbb\ncc\ndd' | sed '1d;3d'
+# bb
+# dd
+
+# Delete last ($) line.
+echo -e 'aa\nbb\ncc\ndd' | sed '$d'
+# aa
+# bb
+# cc
+
+# Delete range of lines.
+echo -e 'aa\nbb\ncc\ndd' | sed '1,3d'
+# dd
+
+# Delete lines matching pattern.
+echo -e 'aa\nbb\ncc\ndd' | sed '/bb/d'
+# aa
+# cc
+# dd
+
+# Delete lines NOT matching pattern.
+echo -e 'aa\nbb\ncc\ndd' | sed '/bb/!d'
+# bb
+</code></pre>
+<h3 id="insert-lines"><a class="header" href="#insert-lines">Insert lines</a></h3>
+<pre><code class="language-sh"># Insert before line.
+echo -e 'aa\nbb' | sed '2iABC'
+# aa
+# ABC
+# bb
+
+# Insert after line.
+echo -e 'aa\nbb' | sed '2aABC'
+# aa
+# bb
+# ABC
+
+# Replace line.
+echo -e 'aa\nbb' | sed '2cABC'
+# aa
+# ABC
+
+# Insert before pattern match.
+echo -e 'aa\nbb' | sed '/bb/i 123'
+# aa
+# 123
+# bb
+</code></pre>
+<h3 id="substitute-lines"><a class="header" href="#substitute-lines">Substitute lines</a></h3>
+<pre><code class="language-sh"># Substitute by regex.
+echo -e 'aafooaa\ncc' | sed 's/foo/MOOSE/'
+# aaMOOSEaa
+# cc
+</code></pre>
+<h3 id="multiple-scripts"><a class="header" href="#multiple-scripts">Multiple scripts</a></h3>
+<pre><code class="language-sh">echo -e 'foo\nbar' | sed -e 's/foo/FOO/' -e 's/FOO/BAR/'
+# BAR
+# bar
+</code></pre>
+<h3 id="edit-inplace-through-symlink"><a class="header" href="#edit-inplace-through-symlink">Edit inplace through symlink</a></h3>
+<pre><code class="language-sh">touch file
+ln -s file link
+ls -l link
+# lrwxrwxrwx 1 johannst johannst 4 Feb 7 23:02 link -&gt; file
+
+sed -i --follow-symlinks '1iabc' link
+ls -l link
+# lrwxrwxrwx 1 johannst johannst 4 Feb 7 23:02 link -&gt; file
+
+sed -i '1iabc' link
+ls -l link
+# -rw-r--r-- 1 johannst johannst 0 Feb 7 23:02 link
+</code></pre>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="column1"><a class="header" href="#column1">column(1)</a></h1>
+<h2 id="examples-2"><a class="header" href="#examples-2">Examples</a></h2>
+<pre><code class="language-sh"># Show as table (aligned columns), with comma as delimiter from stdin.
+echo -e 'a,b,c\n111,22222,33' | column -t -s ','
+
+# Show file as table.
+column -t -s ',' test.csv
+</code></pre>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="sort1"><a class="header" href="#sort1">sort(1)</a></h1>
+<pre><code>sort [opts] [file]
+ opts:
+ -r reverse output
+ -b ignore leading blanks
+
+ -n sort by numeric
+ -h sort by human numeric
+ -V sort by version
+
+ -k&lt;N&gt; sort by Nth key
+ -t&lt;S&gt; field separator
+</code></pre>
+<h2 id="examples-3"><a class="header" href="#examples-3">Examples</a></h2>
+<pre><code class="language-sh"># Sort by directory sizes.
+du -sh * | sort -h
+</code></pre>
+<pre><code class="language-sh"># Sort numeric by second key.
+# The default key separator is non-blank to blank transition.
+echo 'a 4
+d 10
+c 21' | sort -k2 -n
+
+# Sort numeric by second key, split at comma.
+echo 'a,4
+d,10
+c,21' | sort -k2 -n -t,
+</code></pre>
+<blockquote>
+<p>Use <code>--debug</code> to annotate part of the line used to sort and hence debug the key usage.</p>
+</blockquote>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="tr1"><a class="header" href="#tr1">tr(1)</a></h1>
+<pre><code>tr [opt] str1 [str2]
+ -d delete characters in str1
+ -s squeeze repeating sequence of characters in str1
+</code></pre>
+<h2 id="examples-4"><a class="header" href="#examples-4">Examples</a></h2>
+<h3 id="to-lower"><a class="header" href="#to-lower">To lower</a></h3>
+<pre><code class="language-sh">echo MoOsE | tr '[:upper:]' '[:lower:]'
+# output: moose
+</code></pre>
+<h3 id="replace-characters"><a class="header" href="#replace-characters">Replace characters</a></h3>
+<pre><code class="language-sh">echo moose | tr 'o' '-'
+# output: m--se
+
+echo moose | tr 'os' '-'
+# output: m---e
+</code></pre>
+<h3 id="remove-specific-characters"><a class="header" href="#remove-specific-characters">Remove specific characters</a></h3>
+<pre><code class="language-sh">echo moose | tr -d 'o'
+# output: mse
+
+echo moose | tr -d 'os'
+# output: me
+</code></pre>
+<h3 id="squeeze-character-sequences"><a class="header" href="#squeeze-character-sequences">Squeeze character sequences</a></h3>
+<pre><code class="language-sh">echo moooooossse | tr -s 'os'
+# output: mose
+</code></pre>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="tools"><a class="header" href="#tools">Tools</a></h1>
+<ul>
+<li><a href="tools/./tmux.html">tmux</a></li>
+<li><a href="tools/./emacs.html">emacs</a></li>
+<li><a href="tools/./gpg.html">gpg</a></li>
+<li><a href="tools/./radare2.html">radare2</a></li>
+<li><a href="tools/./qemu.html">qemu</a></li>
+<li><a href="tools/./pacman.html">pacman</a></li>
+<li><a href="tools/./dot.html">dot</a></li>
+<li><a href="tools/./ffmpeg.html">ffmpeg</a></li>
+<li><a href="tools/./gnuplot.html">gnuplot</a></li>
+<li><a href="tools/./restic.html">restic</a></li>
+</ul>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="tmux1"><a class="header" href="#tmux1">tmux(1)</a></h1>
+<p>Terminology:</p>
+<ul>
+<li><code>session</code> is a collection of pseudo terminals which can have multiple
+<code>windows</code></li>
+<li><code>window</code> uses the entire screen and can be split into rectangular <code>panes</code></li>
+<li><code>pane</code> is a single pseudo terminal instance</li>
+</ul>
+<h1 id="tmux-cli"><a class="header" href="#tmux-cli">Tmux cli</a></h1>
+<pre><code class="language-markdown"># Session
+tmux creates new session
+tmux ls list running sessions
+tmux kill-session -t &lt;s&gt; kill running session &lt;s&gt;
+tmux attach -t &lt;s&gt; [-d] attach to session &lt;s&gt;, detach other clients [-d]
+tmux detach -s &lt;s&gt; detach all clients from session &lt;s&gt;
+
+# Environment
+tmux showenv -g show global tmux environment variables
+tmux setenv -g &lt;var&gt; &lt;val&gt; set variable in global tmux env
+
+# Misc
+tmux source-file &lt;file&gt; source config &lt;file&gt;
+tmux lscm list available tmux commnds
+tmux show -g show global tmux options
+tmux display &lt;msg&gt; display message in tmux status line
+</code></pre>
+<h2 id="scripting"><a class="header" href="#scripting">Scripting</a></h2>
+<pre><code class="language-markdown"># Session
+tmux list-sessions -F '#S' list running sessions, only IDs
+
+# Window
+tmux list-windows -F '#I' -t &lt;s&gt; list window IDs for session &lt;s&gt;
+tmux selectw -t &lt;s&gt;:&lt;w&gt; select window &lt;w&gt; in session &lt;s&gt;
+
+# Pane
+tmux list-panes -F '#P' -t &lt;s&gt;:&lt;w&gt; list pane IDs for window &lt;w&gt; in session &lt;s&gt;
+tmux selectp -t &lt;s&gt;:&lt;w&gt;.&lt;p&gt; select pane &lt;p&gt; in window &lt;w&gt; in session &lt;s&gt;
+
+# Run commands
+tmux send -t &lt;s&gt;:&lt;w&gt;.&lt;p&gt; "ls" C-m send cmds/keys to pane
+tmux run -t &lt;p&gt; &lt;sh-cmd&gt; run shell command &lt;sh-cmd&gt; in background and report output on pane -t &lt;p&gt;
+</code></pre>
+<p>For example cycle through all panes in all windows in all sessions:</p>
+<pre><code class="language-bash"># bash
+for s in $(tmux list-sessions -F '#S'); do
+ for w in $(tmux list-windows -F '#I' -t $s); do
+ for p in $(tmux list-panes -F '#P' -t $s:$w); do
+ echo $s:$w.$p
+ done
+ done
+done
+</code></pre>
+<h1 id="bindings"><a class="header" href="#bindings">Bindings</a></h1>
+<pre><code class="language-markdown">prefix d detach from current session
+prefix c create new window
+prefix w open window list
+prefix $ rename session
+prefix , rename window
+prefix . move current window
+</code></pre>
+<p>Following bindings are specific to my <a href="https://github.com/johannst/dotfiles/blob/master/tmux.conf"><code>tmux.conf</code></a>:</p>
+<pre><code class="language-markdown">C-s prefix
+
+# Panes
+prefix s horizontal split
+prefix v vertical split
+prefix f toggle maximize/minimize current pane
+
+# Movement
+prefix Tab toggle between window
+
+prefix h move to pane left
+prefix j move to pane down
+prefix k move to pane up
+prefix l move to pane right
+
+# Resize
+prefix C-h resize pane left
+prefix C-j resize pane down
+prefix C-k resize pane up
+prefix C-l resize pane right
+
+# Copy/Paste
+prefix C-v enter copy mode
+prefix C-p paste yanked text
+prefix C-b open copy-buffer list
+
+# In Copy Mode
+v enable visual mode
+y yank selected text
+</code></pre>
+<h1 id="command-mode"><a class="header" href="#command-mode">Command mode</a></h1>
+<p>To enter command mode <code>prefix :</code>.</p>
+<p>Some useful commands are:</p>
+<pre><code class="language-markdown">setw synchronize-panes on/off enables/disables synchronized input to all panes
+list-keys -t vi-copy list keymaps for vi-copy mode
+</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="emacs1"><a class="header" href="#emacs1">emacs(1)</a></h1>
<h2 id="help"><a class="header" href="#help">help</a></h2>
<pre><code class="language-markdown"> C-h ? list available help modes
@@ -1597,7 +1560,7 @@ in the <code>user</code> variable and then print it.</p>
&lt;f1&gt; get doc for completion condidate
M-&lt;digit&gt; select completion candidate
</code></pre>
-<h2 id="tags-1"><a class="header" href="#tags-1">tags</a></h2>
+<h2 id="tags"><a class="header" href="#tags">tags</a></h2>
<p>To generate <code>etags</code> using <code>ctags</code></p>
<pre><code class="language-markdown"> ctags -R -e . generate emacs tag file (important `-e`)
</code></pre>
@@ -1752,7 +1715,7 @@ gpg --verify &lt;file&gt;.asc &lt;file&gt;
<li>http://keyserver.ubuntu.com</li>
<li>hkps://pgp.mailbox.org</li>
</ul>
-<h2 id="examples-1"><a class="header" href="#examples-1">Examples</a></h2>
+<h2 id="examples-5"><a class="header" href="#examples-5">Examples</a></h2>
<h3 id="list-basic-key-information-from-file-with-long-keyids"><a class="header" href="#list-basic-key-information-from-file-with-long-keyids">List basic key information from file with long keyids</a></h3>
<pre><code class="language-bash">gpg --keyid-format 0xlong &lt;key.asc&gt;
</code></pre>
@@ -1769,476 +1732,6 @@ gpg&gt; save
# Update keyserver(s) and/or export new pub keyfile.
</code></pre>
-<div style="break-before: page; page-break-before: always;"></div><h1 id="gdb1"><a class="header" href="#gdb1">gdb(1)</a></h1>
-<h1 id="cli"><a class="header" href="#cli">CLI</a></h1>
-<pre><code class="language-markdown"> gdb [opts] [prg [-c coredump | -p pid]]
- gdb [opts] --args prg &lt;prg-args&gt;
- opts:
- -p &lt;pid&gt; attach to pid
- -c &lt;coredump&gt; use &lt;coredump&gt;
- -x &lt;file&gt; execute script &lt;file&gt; before prompt
- -ex &lt;cmd&gt; execute command &lt;cmd&gt; before prompt
- --tty &lt;tty&gt; set I/O tty for debugee
- --batch run in batch mode, exit after processing options (eg used
- for scripting)
- --batch-silent link --batch, but surpress gdb stdout
-</code></pre>
-<h1 id="interactive-usage"><a class="header" href="#interactive-usage">Interactive usage</a></h1>
-<h2 id="misc"><a class="header" href="#misc">Misc</a></h2>
-<pre><code class="language-markdown"> apropos &lt;regex&gt;
- Search commands matching regex.
-
- tty &lt;tty&gt;
- Set &lt;tty&gt; as tty for debugee.
- Make sure nobody reads from target tty, easiest is to spawn a shell
- and run following in target tty:
- &gt; while true; do sleep 1024; done
-
- sharedlibrary [&lt;regex&gt;]
- Load symbols of shared libs loaded by debugee. Optionally use &lt;regex&gt;
- to filter libs for symbol loading.
-
- display [/FMT] &lt;expr&gt;
- Print &lt;expr&gt; every time debugee stops. Eg print next instr, see
- examples below.
-
- undisplay [&lt;num&gt;]
- Delete display expressions either all or one referenced by &lt;num&gt;.
-
- info display
- List display expressions.
-
- info sharedlibrary [&lt;regex&gt;]
- List shared libraries loaded. Optionally use &lt;regex&gt; to filter.
-</code></pre>
-<h2 id="breakpoints"><a class="header" href="#breakpoints">Breakpoints</a></h2>
-<pre><code class="language-markdown"> break [-qualified] &lt;sym&gt; thread &lt;tnum&gt;
- Set a breakpoint only for a specific thread.
- -qualified: Treat &lt;sym&gt; as fully qualified symbol (quiet handy to set
- breakpoints on C symbols in C++ contexts)
-
- break &lt;sym&gt; if &lt;cond&gt;
- Set conditional breakpoint (see examples below).
-
- delete [&lt;num&gt;]
- Delete breakpoint either all or one referenced by &lt;num&gt;.
-
- info break
- List breakpoints.
-
- cond &lt;bp&gt; &lt;cond&gt;
- Make existing breakpoint &lt;bp&gt; conditional with &lt;cond&gt;.
-
- cond &lt;bp&gt;
- Remove condition from breakpoint &lt;bp&gt;.
-
- tbreak
- Set temporary breakpoint, will be deleted when hit.
- Same syntax as `break`.
-
- rbreak &lt;regex&gt;
- Set breakpoints matching &lt;regex&gt;, where matching internally is done
- on: .*&lt;regex&gt;.*
-
- command [&lt;bp_list&gt;]
- Define commands to run after breakpoint hit. If &lt;bp_list&gt; is not
- specified attach command to last created breakpoint. Command block
- terminated with 'end' token.
-
- &lt;bp_list&gt;: Space separates list, eg 'command 2 5-8' to run command
- for breakpoints: 2,5,6,7,8.
-
- save break &lt;file&gt;
- Save breakpoints to &lt;file&gt;. Can be loaded with the `source` command.
-</code></pre>
-<h2 id="watchpoints"><a class="header" href="#watchpoints">Watchpoints</a></h2>
-<pre><code class="language-markdown"> watch [-location|-l] &lt;expr&gt; [thread &lt;tnum&gt;]
- Create a watchpoint for &lt;expr&gt;, will break if &lt;expr&gt; is written to.
- Watchpoints respect scope of variables, -l can be used to watch the
- memory location instead.
-
- rwatch ...
- Sets a read watchpoint, will break if &lt;expr&gt; is read from.
-
- awatch ...
- Sets an access watchpoint, will break if &lt;expr&gt; is written to or read
- from.
-</code></pre>
-<h2 id="catchpoints"><a class="header" href="#catchpoints">Catchpoints</a></h2>
-<pre><code class="language-markdown"> catch load [&lt;regex&gt;]
- Stop when shared libraries are loaded, optionally specify a &lt;regex&gt;
- to stop only on matches.
- catch unload [&lt;regex&gt;]
- Stop when shared libraries are unloaded, optionally specify a &lt;regex&gt;
- to stop only on matches.
-
- catch throw
- Stop when an exception is thrown.
- catch rethrow
- Stop when an exception is rethrown.
- catch catch
- Stop when an exception is caught.
-
- catch fork
- Stop at calls to fork (also stops at clones, as some systems
- implement fork via clone).
-
- catch syscall [&lt;syscall&gt; &lt;syscall&gt; ..]
- Stop at syscall. If no argument is given, stop at all syscalls.
- Optionally give a list of syscalls to stop at.
-</code></pre>
-<h2 id="inspection-1"><a class="header" href="#inspection-1">Inspection</a></h2>
-<pre><code class="language-markdown"> info functions [&lt;regex&gt;]
- List functions matching &lt;regex&gt;. List all functions if no &lt;regex&gt;
- provided.
-
- info variables [&lt;regex&gt;]
- List variables matching &lt;regex&gt;. List all variables if no &lt;regex&gt;
- provided.
-
- info register [&lt;reg&gt; &lt;reg&gt; ..]
- Dump content of all registers or only the specified &lt;reg&gt;ister.
-</code></pre>
-<h2 id="signal-handling"><a class="header" href="#signal-handling">Signal handling</a></h2>
-<pre><code class="language-markdown"> info handle [&lt;signal&gt;]
- Print how to handle &lt;signal&gt;. If no &lt;signal&gt; specified print for all
- signals.
-
- handle &lt;signal&gt; &lt;action&gt;
- Configure how gdb handles &lt;signal&gt; sent to debugee.
- &lt;action&gt;:
- stop/nostop Catch signal in gdb and break.
- print/noprint Print message when gdb catches signal.
- pass/nopass Pass signal down to debugee.
-
- catch signal &lt;signal&gt;
- Create a catchpoint for &lt;signal&gt;.
-</code></pre>
-<h2 id="multi-threading"><a class="header" href="#multi-threading">Multi-threading</a></h2>
-<pre><code class="language-markdown">info thread
- List all threads.
-
-thread apply &lt;id&gt; [&lt;id&gt;] &lt;command&gt;
- Run command on all threads listed by &lt;id&gt; (space separated list).
- When 'all' is specified as &lt;id&gt; the &lt;command&gt; is run on all threads.
-
-thread name &lt;name&gt;
- The &lt;name&gt; for the current thread.
-</code></pre>
-<h2 id="multi-process"><a class="header" href="#multi-process">Multi-process</a></h2>
-<pre><code class="language-markdown"> set follow-fork-mode &lt;child | parent&gt;
- Specify which process to follow when debuggee makes a fork(2)
- syscall.
-
- set detach-on-fork &lt;on | off&gt;
- Turn on/off detaching from new child processes (on by default).
- Turning this off allows to debug multiple processes (inferiors) with
- one gdb session.
-
- info inferiors
- List all processes gdb debugs.
-
- inferior &lt;id&gt;
- Switch to inferior with &lt;id&gt;.
-</code></pre>
-<h2 id="scheduling"><a class="header" href="#scheduling">Scheduling</a></h2>
-<pre><code class="language-markdown"> set schedule-multiple &lt;on | off&gt;
- on: Resume all threads of all processes (inferiors) when continuing
- or stepping.
- off: (default) Resume only threads of current process (inferior).
-</code></pre>
-<h2 id="shell-commands"><a class="header" href="#shell-commands">Shell commands</a></h2>
-<pre><code class="language-markdown"> shell &lt;shell_cmd&gt;
- Run the shell_cmd and print the output, can also contain a pipeline.
-
- pipe &lt;gdb_cmd&gt; | &lt;shell_cmd&gt;
- Evaluate the gdb_cmd and run the shell_cmd which receives the output
- of the gdb_cmd via stdin.
-</code></pre>
-<h2 id="source-file-locations"><a class="header" href="#source-file-locations">Source file locations</a></h2>
-<pre><code class="language-markdown"> dir &lt;path&gt;
- Add &lt;path&gt; to the beginning of the searh path for source files.
-
- show dir
- Show current search path.
-
- set substitute-path &lt;from&gt; &lt;to&gt;
- Add substitution rule checked during source file lookup.
-
- show substitute-path
- Show current substitution rules.
-</code></pre>
-<h2 id="configuration"><a class="header" href="#configuration">Configuration</a></h2>
-<pre><code class="language-markdown"> set disassembly-flavor &lt;intel | att&gt;
- Set the disassembly style "flavor".
-
- set pagination &lt;on | off&gt;
- Turn on/off gdb's pagination.
-
- set breakpoint pending &lt;on | off | auto&gt;
- on: always set pending breakpoints.
- off: error when trying to set pending breakpoints.
- auto: interatively query user to set breakpoint.
-
- set print pretty &lt;on | off&gt;
- Turn on/off pertty printing of structures.
-
- set style enabled &lt;on | off&gt;
- Turn on/off styling (eg colored output).
-
- set logging &lt;on | off&gt;
- Enable output logging to file (default gdb.txt).
-
- set logging file &lt;fname&gt;
- Change output log file to &lt;fname&gt;
-
- set logging redirect &lt;on | off&gt;
- on: only log to file.
- off: log to file and tty.
-
- set logging overwrite &lt;on | off&gt;
- on: Truncate log file on each run.
- off: Append to logfile (default).
-
- set history filename &lt;fname&gt;
- Change file where to save and restore command history to and from.
-
- set history &lt;on | off&gt;
- Enable or disable saving of command history.
-</code></pre>
-<blockquote>
-<p>Logging options should be configured before logging is turned on.</p>
-</blockquote>
-<h1 id="text-user-interface-tui"><a class="header" href="#text-user-interface-tui">Text user interface (TUI)</a></h1>
-<pre><code class="language-markdown"> C-x a Toggle UI.
- C-l Redraw UI (curses UI can be messed up after the debugee prints to
- stdout/stderr).
- C-x o Change focus.
-</code></pre>
-<h1 id="user-commands-macros"><a class="header" href="#user-commands-macros">User commands (macros)</a></h1>
-<p>Gdb allows to create &amp; document user commands as follows:</p>
-<pre><code class="language-markdown"> define &lt;cmd&gt;
- # cmds
- end
-
- document &lt;cmd&gt;
- # docu
- end
-</code></pre>
-<p>To get all user commands or documentations one can use:</p>
-<pre><code class="language-markdown"> help user-defined
- help &lt;cmd&gt;
-</code></pre>
-<h1 id="hooks"><a class="header" href="#hooks">Hooks</a></h1>
-<p>Gdb allows to create two types of command <code>hooks</code></p>
-<ul>
-<li><code>hook-</code> will be run before <code>&lt;cmd&gt;</code></li>
-<li><code>hookpost-</code> will be run after <code>&lt;cmd&gt;</code></li>
-</ul>
-<pre><code class="language-markdown"> define hook-&lt;cmd&gt;
- # cmds
- end
-
- define hookpost-&lt;cmd&gt;
- # cmds
- end
-</code></pre>
-<h1 id="examples-2"><a class="header" href="#examples-2">Examples</a></h1>
-<h2 id="automatically-print-next-instr"><a class="header" href="#automatically-print-next-instr">Automatically print next instr</a></h2>
-<p>When ever the debugee stops automatically print the memory at the current
-instruction pointer (<code>$rip</code> x86) and format as instruction <code>/i</code>.</p>
-<pre><code class="language-markdown"> # rip - x86
- display /i $rip
-
- # step instruction, after the step the next instruction is automatically printed
- si
-</code></pre>
-<h2 id="conditional-breakpoints"><a class="header" href="#conditional-breakpoints">Conditional breakpoints</a></h2>
-<p>Create conditional breakpoints for a function <code>void foo(int i)</code> in the debugee.</p>
-<pre><code class="language-markdown"> # Create conditional breakpoint
- b foo if i == 42
-
- b foo # would create bp 2
- # Make existing breakpoint conditional
- cond 2 i == 7
-</code></pre>
-<h2 id="set-breakpoint-on-all-threads-except-one"><a class="header" href="#set-breakpoint-on-all-threads-except-one">Set breakpoint on all threads except one</a></h2>
-<p>Create conditional breakpoint using the <code>$_thread</code> <a href="https://sourceware.org/gdb/onlinedocs/gdb/Convenience-Vars.html#Convenience-Vars">convenience
-variable</a>.</p>
-<pre><code class="language-markdown"> # Create conditional breakpoint on all threads except thread 12.
- b foo if $_thread != 12
-</code></pre>
-<h2 id="catch-sigsegv-and-execute-commands"><a class="header" href="#catch-sigsegv-and-execute-commands">Catch SIGSEGV and execute commands</a></h2>
-<p>This creates a <code>catchpoint</code> for the <code>SIGSEGV</code> signal and attached the <code>command</code>
-to it.</p>
-<pre><code class="language-markdown"> catch signal SIGSEGV
- command
- bt
- c
- end
-</code></pre>
-<h2 id="run-backtrace-on-thread-1-batch-mode"><a class="header" href="#run-backtrace-on-thread-1-batch-mode">Run <code>backtrace</code> on thread 1 (batch mode)</a></h2>
-<pre><code class="language-markdown"> gdb --batch -ex 'thread 1' -ex 'bt' -p &lt;pid&gt;
-</code></pre>
-<h2 id="script-gdb-for-automating-debugging-sessions"><a class="header" href="#script-gdb-for-automating-debugging-sessions">Script gdb for automating debugging sessions</a></h2>
-<p>To script gdb add commands into a file and pass it to gdb via <code>-x</code>.
-For example create <code>run.gdb</code>:</p>
-<pre><code class="language-markdown"> set pagination off
-
- break mmap
- command
- info reg rdi rsi rdx
- bt
- c
- end
-
- #initial drop
- c
-</code></pre>
-<p>This script can be used as:</p>
-<pre><code class="language-markdown"> gdb --batch -x ./run.gdb -p &lt;pid&gt;
-</code></pre>
-<h2 id="hook-to-automatically-save-breakpoints-on-quit"><a class="header" href="#hook-to-automatically-save-breakpoints-on-quit">Hook to automatically save breakpoints on <code>quit</code></a></h2>
-<pre><code class="language-markdown">define break-save
- save breakpoint $arg0.gdb.bp
-end
-define break-load
- source $arg0.gdb.bp
-end
-
-define hook-quit
- break-save quit
-end
-</code></pre>
-<h2 id="watchpoint-on-struct--class-member"><a class="header" href="#watchpoint-on-struct--class-member">Watchpoint on struct / class member</a></h2>
-<p>A symbolic watchpoint defined on a member variable for debugging is only valid
-as long as the expression is in scope. Once out of scope the watchpoint gets
-deleted.</p>
-<p>When debugging some memory corruption we want to keep the watchpoint even the
-expression goes out of scope to find the location that overrides the variable
-and introduces the corruption.</p>
-<pre><code class="language-markdown">(gdb) l
-1 struct S { int v; };
-2
-3 void set(struct S* s, int v) {
-4 s-&gt;v = v;
-5 }
-6
-7 int main() {
-8 struct S s;
-9 set(&amp;s, 1);
-10 set(&amp;s, 2);
-11 set(&amp;s, 3);
-...
-
-(gdb) s
-set (s=0x7fffffffe594, v=1) at test.c:4
-4 s-&gt;v = v;
-
-# Define a new watchpoint on the member of the struct. The expression however
-# is only valid in the current functions scope.
-
-(gdb) watch s-&gt;v
-Hardware watchpoint 2: s-&gt;v
-
-(gdb) c
-Hardware watchpoint 2: s-&gt;v
-Old value = 0
-New value = 1
-set (s=0x7fffffffe594, v=1) at test.c:5
-5 }
-
-# The watchpoint gets deleted as soon as we leave the function scope.
-
-(gdb) c
-Watchpoint 2 deleted because the program has left the block in
-which its expression is valid.
-main () at test.c:10
-10 set(&amp;s, 2);
-
-# Define the watchpoint on the location of the object to watch.
-
-(gdb) watch -l s-&gt;v
-
-# This is equivalent to the following.
-
-(gdb) p &amp;s-&gt;v
-$1 = (int *) 0x7fffffffe594
-
-# Define a watchpoint to the address of the member variable of the s instance.
-# This of course only makes sense as long as the s instance is not moved in memory.
-
-(gdb) watch *0x7fffffffe594
-Hardware watchpoint 3: *0x7fffffffe594
-
-(gdb) c
-Hardware watchpoint 3: *0x7fffffffe594
-Old value = 1
-New value = 2
-set (s=0x7fffffffe594, v=2) at test.c:5
-5 }
-
-(gdb) c
-Hardware watchpoint 3: *0x7fffffffe594
-Old value = 2
-New value = 3
-set (s=0x7fffffffe594, v=3) at test.c:5
-5 }
-</code></pre>
-<h2 id="shell-commands-1"><a class="header" href="#shell-commands-1">Shell commands</a></h2>
-<pre><code class="language-markdown"># Run shell commands.
-
-(gdb) shell zcat /proc/config.gz | grep CONFIG_KVM=
-CONFIG_KVM=m
-
-# Pipe gdb command to shell command.
-
-(gdb) pipe info proc mapping | grep libc
- 0x7ffff7a1a000 0x7ffff7a42000 0x28000 0x0 r--p /usr/lib/libc.so.6
- 0x7ffff7a42000 0x7ffff7b9d000 0x15b000 0x28000 r-xp /usr/lib/libc.so.6
- 0x7ffff7b9d000 0x7ffff7bf2000 0x55000 0x183000 r--p /usr/lib/libc.so.6
- 0x7ffff7bf2000 0x7ffff7bf6000 0x4000 0x1d7000 r--p /usr/lib/libc.so.6
- 0x7ffff7bf6000 0x7ffff7bf8000 0x2000 0x1db000 rw-p /usr/lib/libc.so.6
-</code></pre>
-<h1 id="know-bugs"><a class="header" href="#know-bugs">Know Bugs</a></h1>
-<h2 id="workaround-command--finish-bug"><a class="header" href="#workaround-command--finish-bug">Workaround <code>command + finish</code> bug</a></h2>
-<p>When using <code>finish</code> inside a <code>command</code> block, commands after <code>finish</code> are not
-executed. To workaround that bug one can create a wrapper function which calls
-<code>finish</code>.</p>
-<pre><code class="language-markdown"> define handler
- bt
- finish
- info reg rax
- end
-
- command
- handler
- end
-</code></pre>
-<div style="break-before: page; page-break-before: always;"></div><h1 id="gdbserver1"><a class="header" href="#gdbserver1">gdbserver(1)</a></h1>
-<h1 id="cli-1"><a class="header" href="#cli-1">CLI</a></h1>
-<pre><code class="language-markdown"> gdbserver [opts] comm prog [args]
- opts:
- --disable-randomization
- --no-disable-randomization
- --wrapper W --
-
- comm:
- host:port
- tty
-</code></pre>
-<h2 id="example-4"><a class="header" href="#example-4">Example</a></h2>
-<pre><code class="language-markdown"># Start gdbserver.
-gdbserver localhost:1234 /bin/ls
-
-# Attach gdb.
-gdb -ex 'target remote localhost:1234'
-</code></pre>
-<h2 id="wrapper-example-set-environment-variables-just-for-the-debugee"><a class="header" href="#wrapper-example-set-environment-variables-just-for-the-debugee">Wrapper example: Set environment variables just for the debugee</a></h2>
-<p>Set <code>env</code> as execution wrapper with some variables.
-The wrapper will be executed before the debugee.</p>
-<pre><code class="language-markdown">gdbserver --wrapper env FOO=123 BAR=321 -- :12345 /bin/ls
-</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="radare21"><a class="header" href="#radare21">radare2(1)</a></h1>
<h2 id="print"><a class="header" href="#print">print</a></h2>
<pre><code class="language-markdown">
@@ -2258,7 +1751,7 @@ The wrapper will be executed before the debugee.</p>
<pre><code class="language-markdown"> &gt; r2 -B &lt;baddr&gt; &lt;exe&gt; # open &lt;exe&gt; mapped to addr &lt;baddr&gt;
oob &lt;addr&gt; # reopen current file at &lt;baddr&gt;
</code></pre>
-<h1 id="examples-3"><a class="header" href="#examples-3">Examples</a></h1>
+<h1 id="examples-6"><a class="header" href="#examples-6">Examples</a></h1>
<h2 id="patch-file-alter-bytes"><a class="header" href="#patch-file-alter-bytes">Patch file (alter bytes)</a></h2>
<pre><code class="language-markdown"> &gt; r2 [-w] &lt;file&gt;
oo+ # re-open for write if -w was not passed
@@ -2639,135 +2132,6 @@ ffmpeg -framerate 25 -f x11grab $video_args -pix_fmt yuv420p $@ output.mp4
<p>The input <code>-i 0,0+xoff,yoff</code> means to capture <code>$DISPLAY=0.0</code> starting at the
coordinate <code>(xoff, yoff)</code>, which is the left-upper corner, and the size of the
capture is defined by the <code>-video_size</code> argument.</p>
-<div style="break-before: page; page-break-before: always;"></div><h1 id="column1"><a class="header" href="#column1">column(1)</a></h1>
-<h2 id="examples-4"><a class="header" href="#examples-4">Examples</a></h2>
-<pre><code class="language-sh"># Show as table (aligned columns), with comma as delimiter from stdin.
-echo -e 'a,b,c\n111,22222,33' | column -t -s ','
-
-# Show file as table.
-column -t -s ',' test.csv
-</code></pre>
-<div style="break-before: page; page-break-before: always;"></div><h1 id="sort1"><a class="header" href="#sort1">sort(1)</a></h1>
-<pre><code>sort [opts] [file]
- opts:
- -r reverse output
- -b ignore leading blanks
-
- -n sort by numeric
- -h sort by human numeric
- -V sort by version
-
- -k&lt;N&gt; sort by Nth key
- -t&lt;S&gt; field separator
-</code></pre>
-<h2 id="examples-5"><a class="header" href="#examples-5">Examples</a></h2>
-<pre><code class="language-sh"># Sort by directory sizes.
-du -sh * | sort -h
-</code></pre>
-<pre><code class="language-sh"># Sort numeric by second key.
-# The default key separator is non-blank to blank transition.
-echo 'a 4
-d 10
-c 21' | sort -k2 -n
-
-# Sort numeric by second key, split at comma.
-echo 'a,4
-d,10
-c,21' | sort -k2 -n -t,
-</code></pre>
-<blockquote>
-<p>Use <code>--debug</code> to annotate part of the line used to sort and hence debug the key usage.</p>
-</blockquote>
-<div style="break-before: page; page-break-before: always;"></div><h1 id="sed1"><a class="header" href="#sed1">sed(1)</a></h1>
-<pre><code>sed [opts] [script] [file]
- opts:
- -i edit file in place
- -i.bk edit file in place and create backup file
- (with .bk suffix, can be specified differently)
- --follow-symlinks
- follow symlinks when editing in place
- -e SCRIPT add SCRIPT to commands to be executed
- (can be specified multiple times)
- -f FILE add content of FILE to command to be executed
-
- --debug annotate program execution
-</code></pre>
-<h2 id="examples-6"><a class="header" href="#examples-6">Examples</a></h2>
-<h3 id="delete-lines"><a class="header" href="#delete-lines">Delete lines</a></h3>
-<pre><code class="language-sh"># Delete two lines.
-echo -e 'aa\nbb\ncc\ndd' | sed '1d;3d'
-# bb
-# dd
-
-# Delete last ($) line.
-echo -e 'aa\nbb\ncc\ndd' | sed '$d'
-# aa
-# bb
-# cc
-
-# Delete range of lines.
-echo -e 'aa\nbb\ncc\ndd' | sed '1,3d'
-# dd
-
-# Delete lines matching pattern.
-echo -e 'aa\nbb\ncc\ndd' | sed '/bb/d'
-# aa
-# cc
-# dd
-
-# Delete lines NOT matching pattern.
-echo -e 'aa\nbb\ncc\ndd' | sed '/bb/!d'
-# bb
-</code></pre>
-<h3 id="insert-lines"><a class="header" href="#insert-lines">Insert lines</a></h3>
-<pre><code class="language-sh"># Insert before line.
-echo -e 'aa\nbb' | sed '2iABC'
-# aa
-# ABC
-# bb
-
-# Insert after line.
-echo -e 'aa\nbb' | sed '2aABC'
-# aa
-# bb
-# ABC
-
-# Replace line.
-echo -e 'aa\nbb' | sed '2cABC'
-# aa
-# ABC
-
-# Insert before pattern match.
-echo -e 'aa\nbb' | sed '/bb/i 123'
-# aa
-# 123
-# bb
-</code></pre>
-<h3 id="substitute-lines"><a class="header" href="#substitute-lines">Substitute lines</a></h3>
-<pre><code class="language-sh"># Substitute by regex.
-echo -e 'aafooaa\ncc' | sed 's/foo/MOOSE/'
-# aaMOOSEaa
-# cc
-</code></pre>
-<h3 id="multiple-scripts"><a class="header" href="#multiple-scripts">Multiple scripts</a></h3>
-<pre><code class="language-sh">echo -e 'foo\nbar' | sed -e 's/foo/FOO/' -e 's/FOO/BAR/'
-# BAR
-# bar
-</code></pre>
-<h3 id="edit-inplace-through-symlink"><a class="header" href="#edit-inplace-through-symlink">Edit inplace through symlink</a></h3>
-<pre><code class="language-sh">touch file
-ln -s file link
-ls -l link
-# lrwxrwxrwx 1 johannst johannst 4 Feb 7 23:02 link -&gt; file
-
-sed -i --follow-symlinks '1iabc' link
-ls -l link
-# lrwxrwxrwx 1 johannst johannst 4 Feb 7 23:02 link -&gt; file
-
-sed -i '1iabc' link
-ls -l link
-# -rw-r--r-- 1 johannst johannst 0 Feb 7 23:02 link
-</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="gnuplot-1"><a class="header" href="#gnuplot-1">gnuplot (1)</a></h1>
<pre><code># Launch interactive shell.
gnuplot
@@ -2819,7 +2183,7 @@ plot "&lt; head -n2 data.txt"
# Plot with alternate title.
plot "data.txt" title "moose"
</code></pre>
-<h2 id="example-multiple-data-sets-in-on-plot"><a class="header" href="#example-multiple-data-sets-in-on-plot">Example: multiple data sets in on plot</a></h2>
+<h2 id="example-multiple-data-sets-in-plot"><a class="header" href="#example-multiple-data-sets-in-plot">Example: multiple data sets in plot</a></h2>
<pre><code class="language-sh"># file: mem_lat.plot
set title "memory latency (different strides)"
@@ -2844,10 +2208,44 @@ done
gnuplot -p -c mem_lat.plot
</code></pre>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="restic1"><a class="header" href="#restic1">restic(1)</a></h1>
+<h2 id="create-new-snapshot-repository"><a class="header" href="#create-new-snapshot-repository">Create new snapshot repository</a></h2>
+<pre><code class="language-bash"># Create a local backup repository.
+restic -r &lt;path&gt; init
+
+# Create a backup repository on a remote host.
+restic -r sftp:user@host:&lt;path&gt; init
+</code></pre>
+<h2 id="example-restore-file-pattern-from-latest-snapshot"><a class="header" href="#example-restore-file-pattern-from-latest-snapshot">Example: Restore file pattern from <code>latest</code> snapshot</a></h2>
+<p>Restore files matching <code>&lt;file_pattern&gt;</code> from the <code>latest</code> snapshot (pseudo
+snapshot ID) into <code>&lt;dest&gt;</code>.</p>
+<pre><code class="language-bash">restic -r &lt;repo&gt; restore -i &lt;file_pattern&gt; --target &lt;dest&gt; latest
+</code></pre>
+<h2 id="mount-snapshots"><a class="header" href="#mount-snapshots">Mount snapshots</a></h2>
+<p>Mount snapshots as user filesystem (fuse) to given mount point.</p>
+<pre><code class="language-bash">restic -r &lt;repo&gt; mount &lt;mntpoint&gt;
+
+# Mounted snapshots can be limited by host.
+restic -r &lt;repo&gt; mount --host &lt;host&gt; &lt;mntpoint&gt;
+
+# Mounted snapshots can be limited by path (abs path).
+restic -r &lt;repo&gt; mount --path &lt;abspath&gt; &lt;mntpoint&gt;
+</code></pre>
+<h2 id="repository-maintenance"><a class="header" href="#repository-maintenance">Repository maintenance</a></h2>
+<p>Check the repository for errors and report them.</p>
+<pre><code class="language-bash">restic -r &lt;repo&gt; check
+</code></pre>
+<p>Check the repository for non-referenced data and remove it.</p>
+<pre><code class="language-bash">restic -r &lt;repo&gt; prune
+</code></pre>
+<h2 id="references-2"><a class="header" href="#references-2">References</a></h2>
+<ul>
+<li><a href="https://restic.readthedocs.io/en/stable/index.html"><code>restic</code> read the docs</a></li>
+<li><a href="https://restic.readthedocs.io/en/stable/030_preparing_a_new_repo.html#sftp">sftp</a></li>
+</ul>
<div style="break-before: page; page-break-before: always;"></div><h1 id="resource-analysis--monitor"><a class="header" href="#resource-analysis--monitor">Resource analysis &amp; monitor</a></h1>
<ul>
<li><a href="monitor/./lsof.html">lsof</a></li>
-<li><a href="monitor/./ss.html">ss</a></li>
<li><a href="monitor/./pidstat.html">pidstat</a></li>
<li><a href="monitor/./pgrep.html">pgrep</a></li>
<li><a href="monitor/./ps.html">ps</a></li>
@@ -2910,33 +2308,6 @@ and the device is currently busy.</p>
<pre><code class="language-markdown"># Assuming /proc is a mount point.
lsof /proc
</code></pre>
-<div style="break-before: page; page-break-before: always;"></div><h1 id="ss8"><a class="header" href="#ss8">ss(8)</a></h1>
-<pre><code class="language-markdown">ss [option] [filter]
-</code></pre>
-<pre><code class="language-markdown">[option]
- -p ..... Show process using socket
- -l ..... Show sockets in listening state
- -4/-6 .. Show IPv4/6 sockets
- -x ..... Show unix sockets
- -n ..... Show numeric ports (no resolve)
- -O ..... Oneline output per socket
-</code></pre>
-<pre><code class="language-markdown">[filter]
- dport/sport PORT .... Filter for destination/source port
- dst/src ADDR ........ Filter for destination/source address
-
- and/or .............. Logic operator
- ==/!= ............... Comparison operator
-
- (EXPR) .............. Group exprs
-</code></pre>
-<h1 id="examples-8"><a class="header" href="#examples-8">Examples</a></h1>
-<p>Show all tcp IPv4 sockets connecting to port <code>443</code>:</p>
-<pre><code class="language-markdown">ss -4 'dport 443'
-</code></pre>
-<p>Show all tcp IPv4 sockets that don't connect to port <code>443</code> or connect to address <code>1.2.3.4</code>.</p>
-<pre><code class="language-markdown">ss -4 'dport != 443 or dst 1.2.3.4'
-</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="pidstat1"><a class="header" href="#pidstat1">pidstat(1)</a></h1>
<pre><code class="language-markdown">pidstat [opt] [interval] [cont]
-U [user] show username instead UID, optionally only show for user
@@ -3078,7 +2449,7 @@ opts:
trace=signal ............... trace signal related syscalls
signal ..................... trace signals delivered to the process
</code></pre>
-<h1 id="examples-9"><a class="header" href="#examples-9">Examples</a></h1>
+<h1 id="examples-8"><a class="header" href="#examples-8">Examples</a></h1>
<p>Trace <code>open(2)</code> &amp; <code>socket(2)</code> syscalls for a running process + child processes:</p>
<pre><code class="language-markdown">strace -f -e trace=open,socket -p &lt;pid&gt;
</code></pre>
@@ -3093,7 +2464,7 @@ opts:
-l &lt;filter&gt; . show who calls into lib matched by &lt;filter&gt;
-C .......... demangle
</code></pre>
-<h1 id="example-5"><a class="header" href="#example-5">Example</a></h1>
+<h1 id="example-4"><a class="header" href="#example-4">Example</a></h1>
<p>List which program/libs call into <code>libstdc++</code>:</p>
<pre><code class="language-bash">ltrace -l '*libstdc++*' -C -o ltrace.log ./main
</code></pre>
@@ -3215,7 +2586,7 @@ perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl &gt; c
perf script --per-event-dump
# fold &amp; generate as above
</code></pre>
-<h2 id="examples-10"><a class="header" href="#examples-10">Examples</a></h2>
+<h2 id="examples-9"><a class="header" href="#examples-9">Examples</a></h2>
<h3 id="estimate-max-instructions-per-cycle"><a class="header" href="#estimate-max-instructions-per-cycle">Estimate max instructions per cycle</a></h3>
<pre><code class="language-c">#define NOP4 "nop\nnop\nnop\nnop\n"
#define NOP32 NOP4 NOP4 NOP4 NOP4 NOP4 NOP4 NOP4 NOP4
@@ -3279,7 +2650,7 @@ perf report --stdio -g graph,callee
# __libc_start_main
# _start &lt;- callstack bottom
</code></pre>
-<h2 id="references-2"><a class="header" href="#references-2">References</a></h2>
+<h2 id="references-3"><a class="header" href="#references-3">References</a></h2>
<ul>
<li><a href="https://github.com/intel/perfmon">intel/perfmon</a> - intel PMU event database per uarch</li>
<li><a href="https://perfmon-events.intel.com/">intel/perfmon-html</a> - a html rendered version of the PMU
@@ -3367,6 +2738,481 @@ int main() {
<p>Alternatively instrumentation can be controlled with <code>callgrind_control -i on/off</code>.</p>
<p>The files <a href="trace_profile/callgrind/cg_example.cc">cg_example.cc</a> and
<a href="trace_profile/callgrind/Makefile">Makefile</a> provide a full example.</p>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="debug-1"><a class="header" href="#debug-1">Debug</a></h1>
+<ul>
+<li><a href="debug/./gdb.html">gdb</a></li>
+<li><a href="debug/./gdbserver.html">gdbserver</a></li>
+</ul>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="gdb1"><a class="header" href="#gdb1">gdb(1)</a></h1>
+<h1 id="cli"><a class="header" href="#cli">CLI</a></h1>
+<pre><code class="language-markdown"> gdb [opts] [prg [-c coredump | -p pid]]
+ gdb [opts] --args prg &lt;prg-args&gt;
+ opts:
+ -p &lt;pid&gt; attach to pid
+ -c &lt;coredump&gt; use &lt;coredump&gt;
+ -x &lt;file&gt; execute script &lt;file&gt; before prompt
+ -ex &lt;cmd&gt; execute command &lt;cmd&gt; before prompt
+ --tty &lt;tty&gt; set I/O tty for debugee
+ --batch run in batch mode, exit after processing options (eg used
+ for scripting)
+ --batch-silent link --batch, but surpress gdb stdout
+</code></pre>
+<h1 id="interactive-usage"><a class="header" href="#interactive-usage">Interactive usage</a></h1>
+<h2 id="misc"><a class="header" href="#misc">Misc</a></h2>
+<pre><code class="language-markdown"> apropos &lt;regex&gt;
+ Search commands matching regex.
+
+ tty &lt;tty&gt;
+ Set &lt;tty&gt; as tty for debugee.
+ Make sure nobody reads from target tty, easiest is to spawn a shell
+ and run following in target tty:
+ &gt; while true; do sleep 1024; done
+
+ sharedlibrary [&lt;regex&gt;]
+ Load symbols of shared libs loaded by debugee. Optionally use &lt;regex&gt;
+ to filter libs for symbol loading.
+
+ display [/FMT] &lt;expr&gt;
+ Print &lt;expr&gt; every time debugee stops. Eg print next instr, see
+ examples below.
+
+ undisplay [&lt;num&gt;]
+ Delete display expressions either all or one referenced by &lt;num&gt;.
+
+ info display
+ List display expressions.
+
+ info sharedlibrary [&lt;regex&gt;]
+ List shared libraries loaded. Optionally use &lt;regex&gt; to filter.
+</code></pre>
+<h2 id="breakpoints"><a class="header" href="#breakpoints">Breakpoints</a></h2>
+<pre><code class="language-markdown"> break [-qualified] &lt;sym&gt; thread &lt;tnum&gt;
+ Set a breakpoint only for a specific thread.
+ -qualified: Treat &lt;sym&gt; as fully qualified symbol (quiet handy to set
+ breakpoints on C symbols in C++ contexts)
+
+ break &lt;sym&gt; if &lt;cond&gt;
+ Set conditional breakpoint (see examples below).
+
+ delete [&lt;num&gt;]
+ Delete breakpoint either all or one referenced by &lt;num&gt;.
+
+ info break
+ List breakpoints.
+
+ cond &lt;bp&gt; &lt;cond&gt;
+ Make existing breakpoint &lt;bp&gt; conditional with &lt;cond&gt;.
+
+ cond &lt;bp&gt;
+ Remove condition from breakpoint &lt;bp&gt;.
+
+ tbreak
+ Set temporary breakpoint, will be deleted when hit.
+ Same syntax as `break`.
+
+ rbreak &lt;regex&gt;
+ Set breakpoints matching &lt;regex&gt;, where matching internally is done
+ on: .*&lt;regex&gt;.*
+
+ command [&lt;bp_list&gt;]
+ Define commands to run after breakpoint hit. If &lt;bp_list&gt; is not
+ specified attach command to last created breakpoint. Command block
+ terminated with 'end' token.
+
+ &lt;bp_list&gt;: Space separates list, eg 'command 2 5-8' to run command
+ for breakpoints: 2,5,6,7,8.
+
+ save break &lt;file&gt;
+ Save breakpoints to &lt;file&gt;. Can be loaded with the `source` command.
+</code></pre>
+<h2 id="watchpoints"><a class="header" href="#watchpoints">Watchpoints</a></h2>
+<pre><code class="language-markdown"> watch [-location|-l] &lt;expr&gt; [thread &lt;tnum&gt;]
+ Create a watchpoint for &lt;expr&gt;, will break if &lt;expr&gt; is written to.
+ Watchpoints respect scope of variables, -l can be used to watch the
+ memory location instead.
+
+ rwatch ...
+ Sets a read watchpoint, will break if &lt;expr&gt; is read from.
+
+ awatch ...
+ Sets an access watchpoint, will break if &lt;expr&gt; is written to or read
+ from.
+</code></pre>
+<h2 id="catchpoints"><a class="header" href="#catchpoints">Catchpoints</a></h2>
+<pre><code class="language-markdown"> catch load [&lt;regex&gt;]
+ Stop when shared libraries are loaded, optionally specify a &lt;regex&gt;
+ to stop only on matches.
+ catch unload [&lt;regex&gt;]
+ Stop when shared libraries are unloaded, optionally specify a &lt;regex&gt;
+ to stop only on matches.
+
+ catch throw
+ Stop when an exception is thrown.
+ catch rethrow
+ Stop when an exception is rethrown.
+ catch catch
+ Stop when an exception is caught.
+
+ catch fork
+ Stop at calls to fork (also stops at clones, as some systems
+ implement fork via clone).
+
+ catch syscall [&lt;syscall&gt; &lt;syscall&gt; ..]
+ Stop at syscall. If no argument is given, stop at all syscalls.
+ Optionally give a list of syscalls to stop at.
+</code></pre>
+<h2 id="inspection"><a class="header" href="#inspection">Inspection</a></h2>
+<pre><code class="language-markdown"> info functions [&lt;regex&gt;]
+ List functions matching &lt;regex&gt;. List all functions if no &lt;regex&gt;
+ provided.
+
+ info variables [&lt;regex&gt;]
+ List variables matching &lt;regex&gt;. List all variables if no &lt;regex&gt;
+ provided.
+
+ info register [&lt;reg&gt; &lt;reg&gt; ..]
+ Dump content of all registers or only the specified &lt;reg&gt;ister.
+</code></pre>
+<h2 id="signal-handling"><a class="header" href="#signal-handling">Signal handling</a></h2>
+<pre><code class="language-markdown"> info handle [&lt;signal&gt;]
+ Print how to handle &lt;signal&gt;. If no &lt;signal&gt; specified print for all
+ signals.
+
+ handle &lt;signal&gt; &lt;action&gt;
+ Configure how gdb handles &lt;signal&gt; sent to debugee.
+ &lt;action&gt;:
+ stop/nostop Catch signal in gdb and break.
+ print/noprint Print message when gdb catches signal.
+ pass/nopass Pass signal down to debugee.
+
+ catch signal &lt;signal&gt;
+ Create a catchpoint for &lt;signal&gt;.
+</code></pre>
+<h2 id="multi-threading"><a class="header" href="#multi-threading">Multi-threading</a></h2>
+<pre><code class="language-markdown">info thread
+ List all threads.
+
+thread apply &lt;id&gt; [&lt;id&gt;] &lt;command&gt;
+ Run command on all threads listed by &lt;id&gt; (space separated list).
+ When 'all' is specified as &lt;id&gt; the &lt;command&gt; is run on all threads.
+
+thread name &lt;name&gt;
+ The &lt;name&gt; for the current thread.
+</code></pre>
+<h2 id="multi-process"><a class="header" href="#multi-process">Multi-process</a></h2>
+<pre><code class="language-markdown"> set follow-fork-mode &lt;child | parent&gt;
+ Specify which process to follow when debuggee makes a fork(2)
+ syscall.
+
+ set detach-on-fork &lt;on | off&gt;
+ Turn on/off detaching from new child processes (on by default).
+ Turning this off allows to debug multiple processes (inferiors) with
+ one gdb session.
+
+ info inferiors
+ List all processes gdb debugs.
+
+ inferior &lt;id&gt;
+ Switch to inferior with &lt;id&gt;.
+</code></pre>
+<h2 id="scheduling"><a class="header" href="#scheduling">Scheduling</a></h2>
+<pre><code class="language-markdown"> set schedule-multiple &lt;on | off&gt;
+ on: Resume all threads of all processes (inferiors) when continuing
+ or stepping.
+ off: (default) Resume only threads of current process (inferior).
+</code></pre>
+<h2 id="shell-commands"><a class="header" href="#shell-commands">Shell commands</a></h2>
+<pre><code class="language-markdown"> shell &lt;shell_cmd&gt;
+ Run the shell_cmd and print the output, can also contain a pipeline.
+
+ pipe &lt;gdb_cmd&gt; | &lt;shell_cmd&gt;
+ Evaluate the gdb_cmd and run the shell_cmd which receives the output
+ of the gdb_cmd via stdin.
+</code></pre>
+<h2 id="source-file-locations"><a class="header" href="#source-file-locations">Source file locations</a></h2>
+<pre><code class="language-markdown"> dir &lt;path&gt;
+ Add &lt;path&gt; to the beginning of the searh path for source files.
+
+ show dir
+ Show current search path.
+
+ set substitute-path &lt;from&gt; &lt;to&gt;
+ Add substitution rule checked during source file lookup.
+
+ show substitute-path
+ Show current substitution rules.
+</code></pre>
+<h2 id="configuration"><a class="header" href="#configuration">Configuration</a></h2>
+<pre><code class="language-markdown"> set disassembly-flavor &lt;intel | att&gt;
+ Set the disassembly style "flavor".
+
+ set pagination &lt;on | off&gt;
+ Turn on/off gdb's pagination.
+
+ set breakpoint pending &lt;on | off | auto&gt;
+ on: always set pending breakpoints.
+ off: error when trying to set pending breakpoints.
+ auto: interatively query user to set breakpoint.
+
+ set print pretty &lt;on | off&gt;
+ Turn on/off pertty printing of structures.
+
+ set style enabled &lt;on | off&gt;
+ Turn on/off styling (eg colored output).
+
+ set logging &lt;on | off&gt;
+ Enable output logging to file (default gdb.txt).
+
+ set logging file &lt;fname&gt;
+ Change output log file to &lt;fname&gt;
+
+ set logging redirect &lt;on | off&gt;
+ on: only log to file.
+ off: log to file and tty.
+
+ set logging overwrite &lt;on | off&gt;
+ on: Truncate log file on each run.
+ off: Append to logfile (default).
+
+ set history filename &lt;fname&gt;
+ Change file where to save and restore command history to and from.
+
+ set history &lt;on | off&gt;
+ Enable or disable saving of command history.
+</code></pre>
+<blockquote>
+<p>Logging options should be configured before logging is turned on.</p>
+</blockquote>
+<h1 id="text-user-interface-tui"><a class="header" href="#text-user-interface-tui">Text user interface (TUI)</a></h1>
+<pre><code class="language-markdown"> C-x a Toggle UI.
+ C-l Redraw UI (curses UI can be messed up after the debugee prints to
+ stdout/stderr).
+ C-x o Change focus.
+</code></pre>
+<h1 id="user-commands-macros"><a class="header" href="#user-commands-macros">User commands (macros)</a></h1>
+<p>Gdb allows to create &amp; document user commands as follows:</p>
+<pre><code class="language-markdown"> define &lt;cmd&gt;
+ # cmds
+ end
+
+ document &lt;cmd&gt;
+ # docu
+ end
+</code></pre>
+<p>To get all user commands or documentations one can use:</p>
+<pre><code class="language-markdown"> help user-defined
+ help &lt;cmd&gt;
+</code></pre>
+<h1 id="hooks"><a class="header" href="#hooks">Hooks</a></h1>
+<p>Gdb allows to create two types of command <code>hooks</code></p>
+<ul>
+<li><code>hook-</code> will be run before <code>&lt;cmd&gt;</code></li>
+<li><code>hookpost-</code> will be run after <code>&lt;cmd&gt;</code></li>
+</ul>
+<pre><code class="language-markdown"> define hook-&lt;cmd&gt;
+ # cmds
+ end
+
+ define hookpost-&lt;cmd&gt;
+ # cmds
+ end
+</code></pre>
+<h1 id="examples-10"><a class="header" href="#examples-10">Examples</a></h1>
+<h2 id="automatically-print-next-instr"><a class="header" href="#automatically-print-next-instr">Automatically print next instr</a></h2>
+<p>When ever the debugee stops automatically print the memory at the current
+instruction pointer (<code>$rip</code> x86) and format as instruction <code>/i</code>.</p>
+<pre><code class="language-markdown"> # rip - x86
+ display /i $rip
+
+ # step instruction, after the step the next instruction is automatically printed
+ si
+</code></pre>
+<h2 id="conditional-breakpoints"><a class="header" href="#conditional-breakpoints">Conditional breakpoints</a></h2>
+<p>Create conditional breakpoints for a function <code>void foo(int i)</code> in the debugee.</p>
+<pre><code class="language-markdown"> # Create conditional breakpoint
+ b foo if i == 42
+
+ b foo # would create bp 2
+ # Make existing breakpoint conditional
+ cond 2 i == 7
+</code></pre>
+<h2 id="set-breakpoint-on-all-threads-except-one"><a class="header" href="#set-breakpoint-on-all-threads-except-one">Set breakpoint on all threads except one</a></h2>
+<p>Create conditional breakpoint using the <code>$_thread</code> <a href="https://sourceware.org/gdb/onlinedocs/gdb/Convenience-Vars.html#Convenience-Vars">convenience
+variable</a>.</p>
+<pre><code class="language-markdown"> # Create conditional breakpoint on all threads except thread 12.
+ b foo if $_thread != 12
+</code></pre>
+<h2 id="catch-sigsegv-and-execute-commands"><a class="header" href="#catch-sigsegv-and-execute-commands">Catch SIGSEGV and execute commands</a></h2>
+<p>This creates a <code>catchpoint</code> for the <code>SIGSEGV</code> signal and attached the <code>command</code>
+to it.</p>
+<pre><code class="language-markdown"> catch signal SIGSEGV
+ command
+ bt
+ c
+ end
+</code></pre>
+<h2 id="run-backtrace-on-thread-1-batch-mode"><a class="header" href="#run-backtrace-on-thread-1-batch-mode">Run <code>backtrace</code> on thread 1 (batch mode)</a></h2>
+<pre><code class="language-markdown"> gdb --batch -ex 'thread 1' -ex 'bt' -p &lt;pid&gt;
+</code></pre>
+<h2 id="script-gdb-for-automating-debugging-sessions"><a class="header" href="#script-gdb-for-automating-debugging-sessions">Script gdb for automating debugging sessions</a></h2>
+<p>To script gdb add commands into a file and pass it to gdb via <code>-x</code>.
+For example create <code>run.gdb</code>:</p>
+<pre><code class="language-markdown"> set pagination off
+
+ break mmap
+ command
+ info reg rdi rsi rdx
+ bt
+ c
+ end
+
+ #initial drop
+ c
+</code></pre>
+<p>This script can be used as:</p>
+<pre><code class="language-markdown"> gdb --batch -x ./run.gdb -p &lt;pid&gt;
+</code></pre>
+<h2 id="hook-to-automatically-save-breakpoints-on-quit"><a class="header" href="#hook-to-automatically-save-breakpoints-on-quit">Hook to automatically save breakpoints on <code>quit</code></a></h2>
+<pre><code class="language-markdown">define break-save
+ save breakpoint $arg0.gdb.bp
+end
+define break-load
+ source $arg0.gdb.bp
+end
+
+define hook-quit
+ break-save quit
+end
+</code></pre>
+<h2 id="watchpoint-on-struct--class-member"><a class="header" href="#watchpoint-on-struct--class-member">Watchpoint on struct / class member</a></h2>
+<p>A symbolic watchpoint defined on a member variable for debugging is only valid
+as long as the expression is in scope. Once out of scope the watchpoint gets
+deleted.</p>
+<p>When debugging some memory corruption we want to keep the watchpoint even the
+expression goes out of scope to find the location that overrides the variable
+and introduces the corruption.</p>
+<pre><code class="language-markdown">(gdb) l
+1 struct S { int v; };
+2
+3 void set(struct S* s, int v) {
+4 s-&gt;v = v;
+5 }
+6
+7 int main() {
+8 struct S s;
+9 set(&amp;s, 1);
+10 set(&amp;s, 2);
+11 set(&amp;s, 3);
+...
+
+(gdb) s
+set (s=0x7fffffffe594, v=1) at test.c:4
+4 s-&gt;v = v;
+
+# Define a new watchpoint on the member of the struct. The expression however
+# is only valid in the current functions scope.
+
+(gdb) watch s-&gt;v
+Hardware watchpoint 2: s-&gt;v
+
+(gdb) c
+Hardware watchpoint 2: s-&gt;v
+Old value = 0
+New value = 1
+set (s=0x7fffffffe594, v=1) at test.c:5
+5 }
+
+# The watchpoint gets deleted as soon as we leave the function scope.
+
+(gdb) c
+Watchpoint 2 deleted because the program has left the block in
+which its expression is valid.
+main () at test.c:10
+10 set(&amp;s, 2);
+
+# Define the watchpoint on the location of the object to watch.
+
+(gdb) watch -l s-&gt;v
+
+# This is equivalent to the following.
+
+(gdb) p &amp;s-&gt;v
+$1 = (int *) 0x7fffffffe594
+
+# Define a watchpoint to the address of the member variable of the s instance.
+# This of course only makes sense as long as the s instance is not moved in memory.
+
+(gdb) watch *0x7fffffffe594
+Hardware watchpoint 3: *0x7fffffffe594
+
+(gdb) c
+Hardware watchpoint 3: *0x7fffffffe594
+Old value = 1
+New value = 2
+set (s=0x7fffffffe594, v=2) at test.c:5
+5 }
+
+(gdb) c
+Hardware watchpoint 3: *0x7fffffffe594
+Old value = 2
+New value = 3
+set (s=0x7fffffffe594, v=3) at test.c:5
+5 }
+</code></pre>
+<h2 id="shell-commands-1"><a class="header" href="#shell-commands-1">Shell commands</a></h2>
+<pre><code class="language-markdown"># Run shell commands.
+
+(gdb) shell zcat /proc/config.gz | grep CONFIG_KVM=
+CONFIG_KVM=m
+
+# Pipe gdb command to shell command.
+
+(gdb) pipe info proc mapping | grep libc
+ 0x7ffff7a1a000 0x7ffff7a42000 0x28000 0x0 r--p /usr/lib/libc.so.6
+ 0x7ffff7a42000 0x7ffff7b9d000 0x15b000 0x28000 r-xp /usr/lib/libc.so.6
+ 0x7ffff7b9d000 0x7ffff7bf2000 0x55000 0x183000 r--p /usr/lib/libc.so.6
+ 0x7ffff7bf2000 0x7ffff7bf6000 0x4000 0x1d7000 r--p /usr/lib/libc.so.6
+ 0x7ffff7bf6000 0x7ffff7bf8000 0x2000 0x1db000 rw-p /usr/lib/libc.so.6
+</code></pre>
+<h1 id="know-bugs"><a class="header" href="#know-bugs">Know Bugs</a></h1>
+<h2 id="workaround-command--finish-bug"><a class="header" href="#workaround-command--finish-bug">Workaround <code>command + finish</code> bug</a></h2>
+<p>When using <code>finish</code> inside a <code>command</code> block, commands after <code>finish</code> are not
+executed. To workaround that bug one can create a wrapper function which calls
+<code>finish</code>.</p>
+<pre><code class="language-markdown"> define handler
+ bt
+ finish
+ info reg rax
+ end
+
+ command
+ handler
+ end
+</code></pre>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="gdbserver1"><a class="header" href="#gdbserver1">gdbserver(1)</a></h1>
+<h1 id="cli-1"><a class="header" href="#cli-1">CLI</a></h1>
+<pre><code class="language-markdown"> gdbserver [opts] comm prog [args]
+ opts:
+ --disable-randomization
+ --no-disable-randomization
+ --wrapper W --
+
+ comm:
+ host:port
+ tty
+</code></pre>
+<h2 id="example-5"><a class="header" href="#example-5">Example</a></h2>
+<pre><code class="language-markdown"># Start gdbserver.
+gdbserver localhost:1234 /bin/ls
+
+# Attach gdb.
+gdb -ex 'target remote localhost:1234'
+</code></pre>
+<h2 id="wrapper-example-set-environment-variables-just-for-the-debugee"><a class="header" href="#wrapper-example-set-environment-variables-just-for-the-debugee">Wrapper example: Set environment variables just for the debugee</a></h2>
+<p>Set <code>env</code> as execution wrapper with some variables.
+The wrapper will be executed before the debugee.</p>
+<pre><code class="language-markdown">gdbserver --wrapper env FOO=123 BAR=321 -- :12345 /bin/ls
+</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="binary"><a class="header" href="#binary">Binary</a></h1>
<ul>
<li><a href="binary/./od.html">od</a></li>
@@ -3522,6 +3368,7 @@ objdump -C --disassemble=foo::bar &lt;bin&gt;
<li><a href="development/./c++.html">c++</a></li>
<li><a href="development/./glibc.html">glibc</a></li>
<li><a href="development/./gcc.html">gcc</a></li>
+<li><a href="development/./git.html">git</a></li>
<li><a href="development/./cmake.html">cmake</a></li>
<li><a href="development/./make.html">make</a></li>
<li><a href="development/./ld.so.html">ld.so</a></li>
@@ -4576,6 +4423,205 @@ run1:
<li>C ABI (x86_64) - <a href="https://gitlab.com/x86-psABIs/x86-64-ABI">SystemV ABI</a></li>
<li>C++ ABI - <a href="https://itanium-cxx-abi.github.io/cxx-abi">C++ Itanium ABI</a></li>
</ul>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="git1"><a class="header" href="#git1">git(1)</a></h1>
+<h2 id="working-areas"><a class="header" href="#working-areas">Working areas</a></h2>
+<pre><code class="language-text">+-------------------+ --- stash -----&gt; +-------+
+| working directory | | stash | // Shelving area.
++-------------------+ &lt;-- stash pop -- +-------+
+ | ^
+ add |
+ | reset
+ v |
++-------------------+
+| staging area |
++-------------------+
+ |
+ commit
+ |
+ v
++-------------------+
+| local repository |
++-------------------+
+ | ^
+ push |
+ | fetch /
+ | pull
+ v |
++-------------------+
+| remote repository |
++-------------------+
+</code></pre>
+<h2 id="config"><a class="header" href="#config">Config</a></h2>
+<pre><code class="language-markdown"> git config --list --show-origin ..... list currently set configs and where
+ they are coming from
+ git --edit [--global] ............... open config in editor (local or global)
+</code></pre>
+<h2 id="clean"><a class="header" href="#clean">Clean</a></h2>
+<pre><code class="language-markdown"> git clean -X ......... remove only ignored files (-n for dry run)
+ git clean -f -d -x ... remove untracked &amp; ignored files / folders
+ git clean -e &lt;pat&gt; ... exclude pattern from deletion
+</code></pre>
+<h2 id="staging"><a class="header" href="#staging">Staging</a></h2>
+<pre><code class="language-markdown"> git add -p [&lt;file&gt;] ............ partial staging (interactive)
+</code></pre>
+<h2 id="remote"><a class="header" href="#remote">Remote</a></h2>
+<pre><code class="language-markdown"> git remote -v .................. list remotes verbose (with URLs)
+ git remote show [-n] &lt;remote&gt; .. list info for &lt;remote&gt; (like remote HEAD,
+ remote branches, tracking mapping)
+</code></pre>
+<h2 id="branching"><a class="header" href="#branching">Branching</a></h2>
+<pre><code class="language-markdown"> git branch [-a] ................ list available branches; -a to include
+ remote branches
+ git branch -vv ................. list branch &amp; annotate with head sha1 &amp;
+ remote tracking branch
+ git branch &lt;bname&gt; ............. create local branch with name &lt;bname&gt;
+ git branch -d &lt;bname&gt; .......... delete local branch with name &lt;bname&gt;
+ git checkout &lt;bname&gt; ........... switch to branch with name &lt;bname&gt;
+ git checkout --track &lt;branch&gt; .. start to locally track a remote branch
+ git branch --unset-upstream .... unset remote tracking branch
+
+ # Remote
+
+ git push -u origin &lt;rbname&gt; ........ push local branch to origin (or other
+ remote), and setup &lt;rbname&gt; as tracking
+ branch
+ git push origin --delete &lt;rbname&gt; .. delete branch &lt;rbname&gt; from origin (or
+ other remote)
+</code></pre>
+<h2 id="update-local-from-remote"><a class="header" href="#update-local-from-remote">Update local from remote</a></h2>
+<pre><code class="language-markdown"> git fetch --prune .................. update all remote references and
+ remove delete non-existing ones
+ (does not merge into local tracking branch)
+ git pull [--rebase] ................ fetch remote references and merge into
+ local tracking branch (fast-forward by default).
+ Optionally rebase local tracking branch
+ on-top of remote branch (in case local
+ branch has additional commits compared to remote branch).
+</code></pre>
+<h2 id="tags-1"><a class="header" href="#tags-1">Tags</a></h2>
+<pre><code class="language-markdown"> git tag -a &lt;tname&gt; -m "descr" ........ creates an annotated tag (full object
+ containing tagger, date, ...)
+ git tag -l ........................... list available tags
+ git checkout tag/&lt;tname&gt; ............. checkout specific tag
+ git checkout tag/&lt;tname&gt; -b &lt;bname&gt; .. checkout specific tag in a new branch
+
+ # Remote
+
+ git push origin --tags .... push local tags to origin (or other remote)
+</code></pre>
+<h2 id="merging"><a class="header" href="#merging">Merging</a></h2>
+<pre><code class="language-markdown"> git merge [opt] &lt;commit&gt; .... integrate changes from &lt;commit&gt; since
+ opt: current branch and &lt;commit&gt; diverged
+ --squash ................ merge all commits into a single one
+ --no-commit ............. dont generate commit if the merge succeeds
+
+ git merge-base &lt;commit&gt; &lt;commit&gt;
+ get the common ancestor, since both commits diverged
+
+ git rebase -i &lt;upstream&gt; .... interactively rebase on &lt;upstream&gt;, also supports actions
+ like squashing, editing, rewording, etc of commits
+
+ git cherry-pick &lt;commit&gt; .... apply commit on current branch
+</code></pre>
+<h2 id="worktree"><a class="header" href="#worktree">Worktree</a></h2>
+<p>Worktrees allow to maintain multiple working trees in the filesystem linked to
+the same repository (shared .git folder).</p>
+<pre><code class="language-markdown"> git worktree add &lt;path&gt; .............. create a tree at &lt;path&gt; with a new branch
+ checked out (bname is basename of &lt;path&gt;)
+ git worktree add &lt;path&gt; &lt;bname&gt; ...... create a tree at &lt;path&gt; from existing &lt;bname&gt;
+ git worktree list .................... list existing work trees
+ git worktree remove &lt;tree&gt; ........... remove work tree
+ git worktree prune ................... remove stale bookkeeping files
+</code></pre>
+<h2 id="log--commit-history"><a class="header" href="#log--commit-history">Log &amp; Commit History</a></h2>
+<pre><code class="language-markdown"> git log --oneline ......... shows log in single line per commit -&gt; alias for
+ '--pretty=oneline --abbrev-commit'
+ git log --graph ........... text based graph of commit history
+ git log --decorate ........ decorate log with REFs
+
+ git log -p &lt;file&gt; ......... show commit history + diffs for &lt;file&gt;
+ git log --oneline &lt;file&gt; .. show commit history for &lt;file&gt; in compact format
+</code></pre>
+<h2 id="diff--commit-info"><a class="header" href="#diff--commit-info">Diff &amp; Commit Info</a></h2>
+<pre><code class="language-markdown"> git diff &lt;commit&gt;..&lt;commit&gt; [&lt;file&gt;] .... show changes between two arbitrary
+ commits. If one &lt;commit&gt; is omitted
+ it is if HEAD is specified.
+ git diff --name-only &lt;commit&gt;..&lt;commit&gt; . show names of files changed
+ git diff -U$(wc -l &lt;file&gt;) &lt;file&gt; ....... shows complete file with diffs
+ instead of usual diff snippets
+ git diff --staged ....................... show diffs of staged files
+
+ git show --stat &lt;commit&gt; ................ show files changed by &lt;commit&gt;
+ git show &lt;commit&gt; [&lt;file&gt;] .............. show diffs for &lt;commit&gt;
+
+ git show &lt;commit&gt;:&lt;file&gt; ................ show &lt;file&gt; at &lt;commit&gt;
+</code></pre>
+<h2 id="patching"><a class="header" href="#patching">Patching</a></h2>
+<pre><code class="language-markdown"> git format-patch &lt;opt&gt; &lt;since&gt;/&lt;revision range&gt;
+ opt:
+ -N ................... use [PATCH] instead [PATCH n/m] in subject when
+ generating patch description (for patches spanning
+ multiple commits)
+ --start-number &lt;n&gt; ... start output file generation with &lt;n&gt; as start
+ number instead '1'
+ since spcifier:
+ -3 .................. e.g: create a patch from last three commits
+ &lt;commit hash&gt; ....... create patch with commits starting after &lt;commit hash&gt;
+
+ git am &lt;patch&gt; ......... apply patch and create a commit for it
+
+ git apply --stat &lt;PATCH&gt; ... see which files the patch would change
+ git apply --check &lt;PATCH&gt; .. see if the patch can be applied cleanly
+ git apply [-3] &lt;PATCH&gt; ..... apply the patch locally without creating a commit,
+ if the patch does not cleanly apply -3 allows for
+ a 3-way merge
+
+ # eg: generate patches for each commit from initial commit on
+ git format-patch -N $(git rev-list --max-parents=0 HEAD)
+
+ # generate single patch file from a certain commit/ref
+ git format-patch &lt;COMMIT/REF&gt; --stdout &gt; my-patch.patch
+</code></pre>
+<h2 id="resetting"><a class="header" href="#resetting">Resetting</a></h2>
+<pre><code class="language-markdown"> git reset [opt] &lt;ref|commit&gt;
+ opt:
+ --mixed .................... resets index, but not working tree
+ --hard ..................... matches the working tree and index to that
+ of the tree being switched to any changes to
+ tracked files in the working tree since
+ &lt;commit&gt; are lost
+ git reset HEAD &lt;file&gt; .......... remove file from staging
+ git reset --soft HEAD~1 ........ delete most recent commit but keep work
+ git reset --hard HEAD~1 ........ delete most recent commit and delete work
+</code></pre>
+<h2 id="submodules"><a class="header" href="#submodules">Submodules</a></h2>
+<pre><code class="language-markdown"> git submodule add &lt;url&gt; [&lt;path&gt;] .......... add new submodule to current project
+ git clone --recursive &lt;url&gt; ............... clone project and recursively all
+ submodules (same as using
+ 'git submodule update --init
+ --recursive' after clone)
+ git submodule update --init --recursive ... checkout submodules recursively
+ using the commit listed in the
+ super-project (in detached HEAD)
+ git submodule update --remote &lt;submod&gt; .... fetch &amp; merge remote changes for
+ &lt;submod&gt;, this will pull
+ origin/HEAD or a branch specified
+ for the submodule
+ git diff --submodule ...................... show commits that are part of the
+ submodule diff
+</code></pre>
+<h2 id="inspection-1"><a class="header" href="#inspection-1">Inspection</a></h2>
+<pre><code class="language-markdown"> git ls-tree [-r] &lt;ref&gt; .... show git tree for &lt;ref&gt;, -r to recursively ls sub-trees
+ git show &lt;obj&gt; ............ show &lt;obj&gt;
+ git cat-file -p &lt;obj&gt; ..... print content of &lt;obj&gt;
+</code></pre>
+<h2 id="revision-specifier"><a class="header" href="#revision-specifier">Revision Specifier</a></h2>
+<pre><code class="language-markdown"> HEAD ........ last commit
+ HEAD~1 ...... last commit-1
+ HEAD~N ...... last commit-N (linear backwards when in tree structure, check
+ difference between HEAD^ and HEAD~)
+ git rev-list --max-parents=0 HEAD ........... first commit
+</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="cmake1"><a class="header" href="#cmake1">cmake(1)</a></h1>
<h2 id="frequently-used-variables"><a class="header" href="#frequently-used-variables">Frequently used variables</a></h2>
<pre><code># Install location.
@@ -5285,7 +5331,7 @@ func_v0
func_v1
func_v2
</code></pre>
-<h2 id="references-3"><a class="header" href="#references-3">References</a></h2>
+<h2 id="references-4"><a class="header" href="#references-4">References</a></h2>
<ul>
<li><a href="https://akkadia.org/drepper/symbol-versioning">ELF Symbol Versioning</a></li>
<li><a href="https://sourceware.org/binutils/docs/ld/VERSION.html">Binutils ld: Symbol Versioning</a></li>
@@ -5687,7 +5733,7 @@ journalctl --user -u test -n 5
--disk-usage Show current disk usage
--vacuum-size=&lt;size&gt; Reduce journal log to &lt;size&gt; (K/M/G)
</code></pre>
-<h2 id="references-4"><a class="header" href="#references-4">References</a></h2>
+<h2 id="references-5"><a class="header" href="#references-5">References</a></h2>
<ul>
<li><a href="https://www.man7.org/linux/man-pages/man5/systemd.unit.5.html">man systemd.unit(5)</a></li>
<li><a href="https://www.man7.org/linux/man-pages/man5/systemd.service.5.html">man systemd.service(5)</a></li>
@@ -6070,7 +6116,7 @@ group::r-x
mask::r-x
other::rwx
</code></pre>
-<h2 id="references-5"><a class="header" href="#references-5">References</a></h2>
+<h2 id="references-6"><a class="header" href="#references-6">References</a></h2>
<ul>
<li><a href="https://www.man7.org/linux/man-pages/man5/acl.5.html">acl(5)</a></li>
<li><a href="https://www.man7.org/linux/man-pages/man1/getfacl.1.html">getfacl(1)</a></li>
@@ -6301,6 +6347,33 @@ cache.</p>
<li><a href="network/./firewall-cmd.html">firewall-cmd</a></li>
<li><a href="network/./nftables.html">nftables</a></li>
</ul>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="ss8"><a class="header" href="#ss8">ss(8)</a></h1>
+<pre><code class="language-markdown">ss [option] [filter]
+</code></pre>
+<pre><code class="language-markdown">[option]
+ -p ..... Show process using socket
+ -l ..... Show sockets in listening state
+ -4/-6 .. Show IPv4/6 sockets
+ -x ..... Show unix sockets
+ -n ..... Show numeric ports (no resolve)
+ -O ..... Oneline output per socket
+</code></pre>
+<pre><code class="language-markdown">[filter]
+ dport/sport PORT .... Filter for destination/source port
+ dst/src ADDR ........ Filter for destination/source address
+
+ and/or .............. Logic operator
+ ==/!= ............... Comparison operator
+
+ (EXPR) .............. Group exprs
+</code></pre>
+<h1 id="examples-12"><a class="header" href="#examples-12">Examples</a></h1>
+<p>Show all tcp IPv4 sockets connecting to port <code>443</code>:</p>
+<pre><code class="language-markdown">ss -4 'dport 443'
+</code></pre>
+<p>Show all tcp IPv4 sockets that don't connect to port <code>443</code> or connect to address <code>1.2.3.4</code>.</p>
+<pre><code class="language-markdown">ss -4 'dport != 443 or dst 1.2.3.4'
+</code></pre>
<div style="break-before: page; page-break-before: always;"></div><h1 id="tcpdump1"><a class="header" href="#tcpdump1">tcpdump(1)</a></h1>
<h1 id="cli-3"><a class="header" href="#cli-3">CLI</a></h1>
<pre><code class="language-markdown">tcpdump [opts] -i &lt;if&gt; [&lt;filter&gt;]
@@ -6319,7 +6392,7 @@ tcp/udp/icmp Filter for protocol.
<blockquote>
<p>Use <code>and/or/not</code> and <code>()</code> to build filter expressions.</p>
</blockquote>
-<h1 id="examples-12"><a class="header" href="#examples-12">Examples</a></h1>
+<h1 id="examples-13"><a class="header" href="#examples-13">Examples</a></h1>
<h2 id="capture-packets-from-remote-host"><a class="header" href="#capture-packets-from-remote-host">Capture packets from remote host</a></h2>
<pre><code class="language-makrdown"># -k: Start capturing immediately.
ssh &lt;host&gt; tcpdump -i any -w - | sudo wireshark -k -i -
@@ -6351,7 +6424,7 @@ tcp/udp/ssh/wg/... Filter for protocol.
<blockquote>
<p>Use <code>tshak -G</code> to list all fields that can be used in display filters.</p>
</blockquote>
-<h1 id="examples-13"><a class="header" href="#examples-13">Examples</a></h1>
+<h1 id="examples-14"><a class="header" href="#examples-14">Examples</a></h1>
<h2 id="capture-and-filter-packet-to-file"><a class="header" href="#capture-and-filter-packet-to-file">Capture and filter packet to file</a></h2>
<pre><code class="language-bash"># Capture TCP traffic with port 80 on interface eth0 to file.
sudo tshark -i eht0 -f 'tcp and port 80' -w tx.pcap
@@ -6393,7 +6466,7 @@ firewall-cmd --remove-port 8000/tcp
# Remove rich rule.
firewall-cmd --remove-rich-rule 'rule family="ipv4" forward-port port="80" protocol="tcp" to-port="8080"'
</code></pre>
-<h2 id="references-6"><a class="header" href="#references-6">References</a></h2>
+<h2 id="references-7"><a class="header" href="#references-7">References</a></h2>
<ul>
<li>man <a href="https://firewalld.org/documentation/man-pages/firewall-cmd.html">firewall-cmd(1)</a></li>
<li>man <a href="https://firewalld.org/documentation/man-pages/firewalld.html">firewalld(1)</a></li>
@@ -7012,6 +7085,7 @@ const chart = new Chart(
<div style="break-before: page; page-break-before: always;"></div><h1 id="arch"><a class="header" href="#arch">Arch</a></h1>
<ul>
<li><a href="arch/./x86_64.html">x86_64</a></li>
+<li><a href="arch/./armv8.html">armv8</a></li>
<li><a href="arch/./arm64.html">arm64</a></li>
<li><a href="arch/./armv7.html">armv7</a></li>
<li><a href="arch/./riscv.html">riscv</a></li>
@@ -7337,7 +7411,7 @@ greeting_len:
<pre><code class="language-bash">&gt; gcc -o greet greet.s -nostartfiles -nostdlib &amp;&amp; ./greet
Hi ASM-World!
</code></pre>
-<h2 id="references-7"><a class="header" href="#references-7">References</a></h2>
+<h2 id="references-8"><a class="header" href="#references-8">References</a></h2>
<ul>
<li><a href="https://gitlab.com/x86-psABIs/x86-64-ABI">SystemV AMD64 ABI</a></li>
<li><a href="https://www.amd.com/system/files/TechDocs/24592.pdf">AMD64 Vol1: Application Programming</a></li>
@@ -7352,7 +7426,50 @@ Hi ASM-World!
<li><a href="https://sourceware.org/binutils/docs/as/i386_002dDependent.html">GNU Assembler <code>x86_64</code> dependent features</a></li>
<li><a href="https://github.com/johannst/juicebox-asm"><code>juicebox-asm</code> an <code>x86_64</code> jit assembler playground</a></li>
</ul>
+<div style="break-before: page; page-break-before: always;"></div><h1 id="armv8"><a class="header" href="#armv8">armv8</a></h1>
+<p>keywords: aarch64, arm64, A64, aarch32, A32, T32, abi</p>
+<p>The <code>armv8</code> architecture introduces support for 64-bit and defines two
+<em>execution states</em> <code>aarch64</code> and <code>aarch32</code>.</p>
+<p>Implementations are <strong>not</strong> required to implement all execution states for all
+<em>exception levels (EL)</em>. For example the <a href="https://en.wikichip.org/wiki/arm_holdings/microarchitectures/cortex-a32">coretex-a32</a> only
+implements <code>aarch32</code>, while the <a href="https://en.wikichip.org/wiki/arm_holdings/microarchitectures/cortex-a34">coretex-a34</a> only implements
+<code>aarch64</code>.</p>
+<p>The execution states support different instruction sets.</p>
+<ul>
+<li><code>aarch64</code> only supports the new <a href="https://developer.arm.com/documentation/ddi0602/latest"><code>A64</code></a> instruction set, where all
+instructions have the fixed size of of 32 bits.</li>
+<li><code>aarch32</code> supports the <a href="https://developer.arm.com/documentation/ddi0597/latest"><code>A32</code></a> and <a href="https://developer.arm.com/documentation/ddi0597/latest"><code>T32</code></a> instruction sets. These
+are updated versions of the <code>armv7</code> instruction sets, kept backwards
+compatible allowing <code>armv7</code> programs to run on <code>armv8</code>.
+<blockquote>
+<p>In <code>armv7</code> the instruction sets <code>A32</code> an <code>T32</code> were called <code>arm</code> and
+<code>thumb</code> respectively.</p>
+</blockquote>
+</li>
+</ul>
+<p>A <em>program</em> always runs in either the <code>aarch64</code> or the <code>aarch32</code> execution
+state, but never in a <em>mixture</em> of both. Transitions between execution states
+only occur when raising or lowering the exception level.</p>
+<ul>
+<li><code>aarch64 -&gt; aarch32</code> can only occur when switching from <em>higher EL</em> to <em>lower
+EL</em>.</li>
+<li><code>aarch32 -&gt; aarch64</code> can only occur when switching from <em>lower EL</em> to <em>higher
+EL</em>.</li>
+</ul>
+<p>The following figure depicts which execution state Transitions are allowed.</p>
+<pre><code> (user) EL0 ^ |
+ (os) EL1 | 32-&gt;64
+(hypervisor) EL2 64-&gt;32 |
+ (secure) EL3 | v
+</code></pre>
+<p>This means for example, an <em>os</em> running in <code>aarch32</code> can only support <code>aarch32</code>
+user applications, while an <em>os</em> running in <code>aarch64</code> can support
+<code>aarch32 / aarch64</code> user applications.</p>
<div style="break-before: page; page-break-before: always;"></div><h1 id="arm64"><a class="header" href="#arm64">arm64</a></h1>
+<blockquote>
+<p>This page only talks about the 64 bit part of the <code>armv8</code> architecture. For
+an overview see <a href="arch/./armv8.html"><code>armv8</code></a>.</p>
+</blockquote>
<p>keywords: arm64, aarch64, abi</p>
<ul>
<li>64bit synonyms: <code>arm64</code>, <code>aarch64</code></li>
@@ -7567,7 +7684,7 @@ Hi ASM-World!
distributions. Explicitly specifying the dynamic linker should not be
required when compiling natively on arm64.</p>
</blockquote>
-<h2 id="references-8"><a class="header" href="#references-8">References</a></h2>
+<h2 id="references-9"><a class="header" href="#references-9">References</a></h2>
<ul>
<li><a href="https://github.com/ARM-software/abi-aa/blob/master/aapcs64/aapcs64.rst">Procedure Call Standard ARM64</a></li>
<li><a href="https://developer.arm.com/documentation/den0024/latest">ARMv8-A Programmer's Guide</a></li>
@@ -7812,7 +7929,7 @@ Hi ASM-World!
distributions. Explicitly specifying the dynamic linker should not be
required when compiling natively on arm.</p>
</blockquote>
-<h2 id="references-9"><a class="header" href="#references-9">References</a></h2>
+<h2 id="references-10"><a class="header" href="#references-10">References</a></h2>
<ul>
<li><a href="https://github.com/ARM-software/abi-aa/blob/master/aapcs32/aapcs32.rst">Procedure Call Standard ARM</a></li>
<li><a href="https://developer.arm.com/documentation/den0013/latest">ARMv7-A Programmer's Guide</a></li>
@@ -7893,7 +8010,7 @@ distributions. Explicitly specifying the dynamic linker should not be
required when compiling natively on riscv.</p>
<p>Select dynamic linker according to abi used during compile &amp; link.</p>
</blockquote>
-<h2 id="references-10"><a class="header" href="#references-10">References</a></h2>
+<h2 id="references-11"><a class="header" href="#references-11">References</a></h2>
<ul>
<li><a href="https://sourceware.org/binutils/docs/as">GNU Assembler</a></li>
<li><a href="https://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops">GNU Assembler Directives</a></li>