shelltricks.html 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="X-UA-Compatible" content="IE=Edge">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <link rel="shortcut icon" href="/htdocs/favicon.ico">
  7. <script type="text/javascript" src="/htdocs/bugstatus.js"></script>
  8. <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  9. <meta name="robots" content="index,nofollow">
  10. <title>ShellTricks - Debian Wiki</title>
  11. <script type="text/javascript" src="/htdocs/common/js/common.js"></script>
  12. <script type="text/javascript">
  13. <!--
  14. var search_hint = "Search";
  15. //-->
  16. </script>
  17. <link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/htdocs/debwiki/css/common.css">
  18. <link rel="stylesheet" type="text/css" charset="utf-8" media="screen" href="/htdocs/debwiki/css/screen.css">
  19. <link rel="stylesheet" type="text/css" charset="utf-8" media="print" href="/htdocs/debwiki/css/print.css">
  20. <link rel="stylesheet" type="text/css" charset="utf-8" media="projection" href="/htdocs/debwiki/css/projection.css">
  21. <link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/htdocs/debian-wiki-1.0.css">
  22. <!-- css only for MS IE6/IE7 browsers -->
  23. <!--[if lt IE 8]>
  24. <link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/htdocs/debwiki/css/msie.css">
  25. <![endif]-->
  26. <link rel="alternate" title="Debian Wiki: ShellTricks" href="/ShellTricks?diffs=1&amp;show_att=1&amp;action=rss_rc&amp;unique=0&amp;page=ShellTricks&amp;ddiffs=1" type="application/rss+xml">
  27. <link rel="Start" href="/FrontPage">
  28. <link rel="Alternate" title="Wiki Markup" href="/ShellTricks?action=raw">
  29. <link rel="Alternate" media="print" title="Print View" href="/ShellTricks?action=print">
  30. <link rel="Search" href="/FindPage">
  31. <link rel="Index" href="/TitleIndex">
  32. <link rel="Glossary" href="/WordIndex">
  33. <link rel="Help" href="/HelpOnFormatting">
  34. </head>
  35. <body lang="en" dir="ltr">
  36. <div id="logo"><a href="https://www.debian.org" title="Debian Homepage"><img src="https://www.debian.org/Pics/openlogo-50.png" alt="Debian" width="50" height="61"></a></div>
  37. <div id="header">
  38. <div id="wikisection">
  39. <p class="section"><a href="/FrontPage" title="Debian Wiki Homepage">Wiki</a></p>
  40. <div id="username"><a href="/ShellTricks?action=login" id="login" rel="nofollow">Login</a></div>
  41. </div>
  42. <div id="navbar">
  43. <ul id="navibar">
  44. <li class="wikilink"><a href="/FrontPage">FrontPage</a></li><li class="wikilink"><a href="/RecentChanges">RecentChanges</a></li><li class="wikilink"><a href="/FindPage">FindPage</a></li><li class="wikilink"><a href="/HelpContents">HelpContents</a></li><li class="current"><a href="/ShellTricks">ShellTricks</a></li>
  45. </ul>
  46. </div>
  47. <form id="searchform" method="get" action="/ShellTricks">
  48. <div>
  49. <input type="hidden" name="action" value="fullsearch">
  50. <input type="hidden" name="context" value="180">
  51. <label for="searchinput">Search:</label>
  52. <input id="searchinput" type="text" name="value" value="" size="20"
  53. onfocus="searchFocus(this)" onblur="searchBlur(this)"
  54. onkeyup="searchChange(this)" onchange="searchChange(this)" alt="Search">
  55. <input id="titlesearch" name="titlesearch" type="submit"
  56. value="Titles" alt="Search Titles">
  57. <input id="fullsearch" name="fullsearch" type="submit"
  58. value="Text" alt="Search Full Text">
  59. </div>
  60. </form>
  61. <script type="text/javascript">
  62. <!--// Initialize search form
  63. var f = document.getElementById('searchform');
  64. f.getElementsByTagName('label')[0].style.display = 'none';
  65. var e = document.getElementById('searchinput');
  66. searchChange(e);
  67. searchBlur(e);
  68. //-->
  69. </script>
  70. <div id="logo"><a href="https://www.debian.org" title="Debian Homepage"><img src="https://www.debian.org/Pics/openlogo-50.png" alt="Debian" width="50" height="61"></a></div>
  71. <div id="breadcrumbs"><a href="/FrontPage" title="Debian Wiki Homepage">Wiki</a><span class="sep">/</span>
  72. </div>
  73. <ul class="editbar"><li><a href="/ShellTricks?action=login" id="login-1" rel="nofollow">Login</a></li><li class="toggleCommentsButton" style="display:none;"><a href="#" class="nbcomment" onClick="toggleComments();return false;">Comments</a></li><li><a class="nbinfo" href="/ShellTricks?action=info" rel="nofollow">Info</a></li><li><a class="nbattachments" href="/ShellTricks?action=AttachFile" rel="nofollow">Attachments</a></li><li>
  74. <form class="actionsmenu" method="GET" action="/ShellTricks">
  75. <div>
  76. <label>More Actions:</label>
  77. <select name="action"
  78. onchange="if ((this.selectedIndex != 0) &&
  79. (this.options[this.selectedIndex].disabled == false)) {
  80. this.form.submit();
  81. }
  82. this.selectedIndex = 0;">
  83. <option value="raw">Raw Text</option>
  84. <option value="print">Print View</option>
  85. <option value="RenderAsDocbook">Render as Docbook</option>
  86. <option value="refresh">Delete Cache</option>
  87. <option value="show" disabled class="disabled">------------------------</option>
  88. <option value="SpellCheck">Check Spelling</option>
  89. <option value="LikePages">Like Pages</option>
  90. <option value="LocalSiteMap">Local Site Map</option>
  91. <option value="show" disabled class="disabled">------------------------</option>
  92. <option value="RenamePage" disabled class="disabled">Rename Page</option>
  93. <option value="DeletePage" disabled class="disabled">Delete Page</option>
  94. <option value="show" disabled class="disabled">------------------------</option>
  95. <option value="show" disabled class="disabled">Subscribe User</option>
  96. <option value="show" disabled class="disabled">------------------------</option>
  97. <option value="show" disabled class="disabled">Remove Spam</option>
  98. <option value="show" disabled class="disabled">Revert to this revision</option>
  99. <option value="PackagePages">Package Pages</option>
  100. <option value="show" disabled class="disabled">------------------------</option>
  101. <option value="Load">Load</option>
  102. <option value="Save">Save</option>
  103. <option value="SlideShow">SlideShow</option>
  104. </select>
  105. <input type="submit" value="Do">
  106. </div>
  107. <script type="text/javascript">
  108. <!--// Init menu
  109. actionsMenuInit('More Actions:');
  110. //-->
  111. </script>
  112. </form>
  113. </li></ul>
  114. <h1 id="locationline">
  115. <ul id="pagelocation">
  116. <li><a href="/ShellTricks">ShellTricks</a></li>
  117. </ul>
  118. </h1>
  119. </div>
  120. <div id="page" lang="en" dir="ltr">
  121. <div dir="ltr" id="content" lang="en"><span class="anchor" id="top"></span>
  122. <span class="anchor" id="line-1"></span><div><table style="&amp;quot; width: 100%; &amp;quot;"><tbody><tr> <td style="&amp;quot; border: 0px hidden&amp;quot;"><p class="line891"><small><a href="/DebianWiki/EditorGuide#translation">Translation(s)</a>: English - <a href="/fr/ShellTricks">Français</a> - <a href="/it/ShellTricks">Italiano</a></small></td>
  123. <td style="&amp;quot; text-align: right; border: 0px hidden&amp;quot;"><p class="line862"> <img alt="(!)" height="16" src="/htdocs/debwiki/img/idea.png" title="(!)" width="16" /> <a class="nonexistent" href="/ShellTricks/Discussion">?</a>Discussion</td>
  124. </tr>
  125. </tbody></table></div><span class="anchor" id="line-2"></span><span class="anchor" id="line-3"></span><p class="line867"><div class="table-of-contents"><p class="table-of-contents-heading">Contents<ol><li>
  126. <a href="#Shell_Scripting_Tricks">Shell Scripting Tricks</a><ol><li>
  127. <a href="#How_do_I_see_how_much_disk_space_is_left.3F">How do I see how much disk space is left?</a></li><li>
  128. <a href="#How_do_I_see_where_all_my_big_files_are.3F__My_file_system_is_full.">How do I see where all my big files are? My file system is full.</a></li><li>
  129. <a href="#I_have_a_directory_full_of_MP3s..._how_do_I_rename_them_all_with_underscores_instead_of_spaces.3F">I have a directory full of MP3s... how do I rename them all with underscores instead of spaces?</a></li><li>
  130. <a href="#How_do_I_do_that_recursively.3F">How do I do that recursively?</a></li><li>
  131. <a href="#How_do_I_.28recursively.29_rename_all_files_from_uppercase_to_lowercase.3F">How do I (recursively) rename all files from uppercase to lowercase?</a></li><li>
  132. <a href="#How_do_I_remove_a_file_that_begins_with_.22-.22.3F">How do I remove a file that begins with &quot;-&quot;?</a></li><li>
  133. <a href="#How_do_I_monitor_something_in_realtime.3F">How do I monitor something in realtime?</a></li><li>
  134. <a href="#How_do_I_get_only_the_filename_in_a_full_pathname.3F">How do I get only the filename in a full pathname?</a></li><li>
  135. <a href="#How_do_I_test_whether_a_directory_has_files_in_it.3F">How do I test whether a directory has files in it?</a></li><li>
  136. <a href="#How_do_I_start_a_process_in_background.3F">How do I start a process in background?</a></li><li>
  137. <a href="#How_do_I_work_with_arrays_in_bash.3F">How do I work with arrays in bash?</a></li><li>
  138. <a href="#How_do_I_use_a_variable_within_a_variable_.28variable_interpolation.29_in_bash.3F">How do I use a variable within a variable (variable interpolation) in bash?</a></li><li>
  139. <a href="#How_do_I_count_the_lines_of_files_with_certain_extensions_in_a_certain_directory.3F">How do I count the lines of files with certain extensions in a certain directory?</a></li></ol></li></ol></div> <span class="anchor" id="line-4"></span><span class="anchor" id="line-5"></span><p class="line867">
  140. <h1 id="Shell_Scripting_Tricks">Shell Scripting Tricks</h1>
  141. <span class="anchor" id="line-6"></span><p class="line867"><span class="anchor" id="line-7"></span><div class="note"><span class="anchor" id="line-1-1"></span><p class="line867"><strong>Note:</strong> Debian Wiki is not necessarily the best place to find help with shell scripts. If your scripting problem involves bash (or Bourne shell), you might try bash instead. A bash FAQ is at <a class="http" href="http://mywiki.wooledge.org/BashFAQ">http://mywiki.wooledge.org/BashFAQ</a> and contains many more tricks than this page does. </div><span class="anchor" id="line-8"></span><span class="anchor" id="line-9"></span><p class="line867">
  142. <h2 id="How_do_I_see_how_much_disk_space_is_left.3F">How do I see how much disk space is left?</h2>
  143. <span class="anchor" id="line-10"></span><p class="line867"><span class="anchor" id="line-11"></span><span class="anchor" id="line-12"></span><pre><span class="anchor" id="line-1"></span>df
  144. <span class="anchor" id="line-2"></span>df -h # for a human readable format in megs &amp; gigs</pre><span class="anchor" id="line-13"></span><p class="line867">
  145. <h2 id="How_do_I_see_where_all_my_big_files_are.3F__My_file_system_is_full.">How do I see where all my big files are? My file system is full.</h2>
  146. <span class="anchor" id="line-14"></span><p class="line867"><span class="anchor" id="line-15"></span><span class="anchor" id="line-16"></span><span class="anchor" id="line-17"></span><pre><span class="anchor" id="line-1-1"></span>cd /somewhere
  147. <span class="anchor" id="line-2-1"></span>du -sk * | sort -n
  148. <span class="anchor" id="line-3"></span># Repeat as necessary</pre><span class="anchor" id="line-18"></span><span class="anchor" id="line-19"></span><p class="line874">If you want to see big directories instead of files, you can do: <span class="anchor" id="line-20"></span><span class="anchor" id="line-21"></span><p class="line867"><span class="anchor" id="line-22"></span><span class="anchor" id="line-23"></span><pre><span class="anchor" id="line-1-2"></span>du -x /somewhere | sort -n | tail -10
  149. <span class="anchor" id="line-2-2"></span># This shows the 10 largest directories under /somewhere</pre><span class="anchor" id="line-24"></span><span class="anchor" id="line-25"></span><p class="line874">Another way: <span class="anchor" id="line-26"></span><span class="anchor" id="line-27"></span><p class="line867"><span class="anchor" id="line-28"></span><span class="anchor" id="line-29"></span><pre><span class="anchor" id="line-1-3"></span>find /somewhere -size +2000k -ls
  150. <span class="anchor" id="line-2-3"></span># This shows all files over 2000 kilobytes under /somewhere</pre><span class="anchor" id="line-30"></span><p class="line874">If you want to keep your .debs, you can filter them out of the list: <span class="anchor" id="line-31"></span><span class="anchor" id="line-32"></span><p class="line867"><span class="anchor" id="line-33"></span><span class="anchor" id="line-34"></span><pre><span class="anchor" id="line-1-4"></span>find / -size +2000k ! -name &quot;*.deb&quot; -ls
  151. <span class="anchor" id="line-2-4"></span># This shows all files on your entire system over 2000 kilobytes that are not debian packages</pre><span class="anchor" id="line-35"></span><span class="anchor" id="line-36"></span><span class="anchor" id="line-37"></span><p class="line867">
  152. <h2 id="I_have_a_directory_full_of_MP3s..._how_do_I_rename_them_all_with_underscores_instead_of_spaces.3F">I have a directory full of MP3s... how do I rename them all with underscores instead of spaces?</h2>
  153. <span class="anchor" id="line-38"></span><p class="line867"><span class="anchor" id="line-39"></span><pre><span class="anchor" id="line-1-5"></span>rename 's/ /_/g' *.mp3</pre><span class="anchor" id="line-40"></span><p class="line862">The <tt>rename</tt> command is not a general Unix command but it's included with Perl which is of course installed by default in Debian. <span class="anchor" id="line-41"></span><span class="anchor" id="line-42"></span><p class="line867">
  154. <h2 id="How_do_I_do_that_recursively.3F">How do I do that recursively?</h2>
  155. <span class="anchor" id="line-43"></span><p class="line862">That's a bit tricky. You can get a list of files to pass to <tt>rename</tt> using <tt>find</tt>, but if some of the directories are being renamed as well, that's not something <tt>rename</tt> can keep track of. You have to use <tt>-depth</tt> with <tt>find</tt> to make sure any files are renamed before the directories they're in. <span class="anchor" id="line-44"></span><span class="anchor" id="line-45"></span><p class="line867"><span class="anchor" id="line-46"></span><span class="anchor" id="line-47"></span><pre><span class="anchor" id="line-1-6"></span>cd /somewhere
  156. <span class="anchor" id="line-2-5"></span>find . -depth -name '* *' -type f -print0 | xargs -r0 rename 's/ /_/g'</pre><span class="anchor" id="line-48"></span><p class="line867">
  157. <h2 id="How_do_I_.28recursively.29_rename_all_files_from_uppercase_to_lowercase.3F">How do I (recursively) rename all files from uppercase to lowercase?</h2>
  158. <span class="anchor" id="line-49"></span><p class="line874">Once again, this is hard if the directories themselves have uppercase letters in their names. Let's assume for the moment that they don't. Then: <span class="anchor" id="line-50"></span><span class="anchor" id="line-51"></span><p class="line867"><span class="anchor" id="line-52"></span><span class="anchor" id="line-53"></span><pre><span class="anchor" id="line-1-7"></span>cd /somewhere
  159. <span class="anchor" id="line-2-6"></span>find . -name '*[A-Z]*' -type f -print0 | xargs -0 rename 'y/A-Z/a-z/'</pre><span class="anchor" id="line-54"></span><p class="line874">Unfortunately, whenever this question pops up, that's usually not enough -- the person asking usually has uppercase directory names too. So something like this might be required: <span class="anchor" id="line-55"></span><span class="anchor" id="line-56"></span><p class="line867"><span class="anchor" id="line-57"></span><span class="anchor" id="line-58"></span><span class="anchor" id="line-59"></span><span class="anchor" id="line-60"></span><span class="anchor" id="line-61"></span><span class="anchor" id="line-62"></span><span class="anchor" id="line-63"></span><pre><span class="anchor" id="line-1-8"></span>cd /somewhere
  160. <span class="anchor" id="line-2-7"></span>find . -type d -depth -name '*[A-Z]*' -print |
  161. <span class="anchor" id="line-3-1"></span> while read dir; do dname=&quot;$(dirname $dir)&quot;; bname=&quot;$(basename $dir)&quot;;
  162. <span class="anchor" id="line-4"></span> newbname=&quot;$(echo $bname | tr [:upper:] [:lower:])&quot;; mv &quot;$dir&quot; &quot;$dname/$newbname&quot;; done
  163. <span class="anchor" id="line-5"></span># That renames the directories. The -depth makes it go through the deepest ones first, so we don't rename
  164. <span class="anchor" id="line-6"></span># A to a until we've already renamed A/B to A/b.
  165. <span class="anchor" id="line-7"></span>find . -name '*[A-Z]*' -type f -print0 | xargs -0 rename 'y/A-Z/a-z/'</pre><span class="anchor" id="line-64"></span><p class="line862">Note that the more complex script above is imperfect: it will fail if any directories have newlines in their names, and it may also fail under some conditions if any files or directories have whitespace in their names. Use at your own risk. (Hint: if you want to test it before you commit to it, put an <tt>echo</tt> in front of the <tt>mv</tt>.) <span class="anchor" id="line-65"></span><span class="anchor" id="line-66"></span><p class="line874">In fact, this simpler solution might work better: <span class="anchor" id="line-67"></span><span class="anchor" id="line-68"></span><p class="line867"><span class="anchor" id="line-69"></span><pre><span class="anchor" id="line-1-9"></span>find /somewhere -depth -name '*[A-Z]*' -print0 | xargs -r0 rename 'y/A-Z/a-z/'</pre><span class="anchor" id="line-70"></span><p class="line862">Here, too, it might be a good idea to put in an <tt>echo</tt> before the <tt>rename</tt> command to test before you actually run this. <span class="anchor" id="line-71"></span><span class="anchor" id="line-72"></span><p class="line867">
  166. <h2 id="How_do_I_remove_a_file_that_begins_with_.22-.22.3F">How do I remove a file that begins with &quot;-&quot;?</h2>
  167. <span class="anchor" id="line-73"></span><p class="line867"><span class="anchor" id="line-74"></span><span class="anchor" id="line-75"></span><pre><span class="anchor" id="line-1-10"></span>unlink -foo</pre><span class="anchor" id="line-76"></span><p class="line874">Three different ways: <span class="anchor" id="line-77"></span><span class="anchor" id="line-78"></span><p class="line867"><span class="anchor" id="line-79"></span><span class="anchor" id="line-80"></span><span class="anchor" id="line-81"></span><pre><span class="anchor" id="line-1-11"></span>rm -- -foo
  168. <span class="anchor" id="line-2-8"></span>rm ./-foo
  169. <span class="anchor" id="line-3-2"></span>using 'mc', and pressing F8 on the appropriate file</pre><span class="anchor" id="line-82"></span><p class="line862">These two tricks work with nearly every command line tool, not only <tt>rm</tt>. <span class="anchor" id="line-83"></span><span class="anchor" id="line-84"></span><p class="line867">
  170. <h2 id="How_do_I_monitor_something_in_realtime.3F">How do I monitor something in realtime?</h2>
  171. <span class="anchor" id="line-85"></span><p class="line874">If it's a log file, follow the tail of the file: <span class="anchor" id="line-86"></span><span class="anchor" id="line-87"></span><p class="line867"><span class="anchor" id="line-88"></span><span class="anchor" id="line-89"></span><pre><span class="anchor" id="line-1-12"></span>tail -f /var/log/messages</pre><span class="anchor" id="line-90"></span><p class="line874">or <span class="anchor" id="line-91"></span><span class="anchor" id="line-92"></span><p class="line867"><span class="anchor" id="line-93"></span><span class="anchor" id="line-94"></span><pre><span class="anchor" id="line-1-13"></span>less +F /var/log/messages</pre><span class="anchor" id="line-95"></span><p class="line862">If it's a general command, use <tt>watch</tt>: <span class="anchor" id="line-96"></span><span class="anchor" id="line-97"></span><p class="line867"><span class="anchor" id="line-98"></span><span class="anchor" id="line-99"></span><pre><span class="anchor" id="line-1-14"></span>watch -n 1 ls -l ~/some/file</pre><span class="anchor" id="line-100"></span><p class="line874">This works well when monitoring a firewall with iptables / tc or like tasks. <span class="anchor" id="line-101"></span><span class="anchor" id="line-102"></span><p class="line867">
  172. <h2 id="How_do_I_get_only_the_filename_in_a_full_pathname.3F">How do I get only the filename in a full pathname?</h2>
  173. <span class="anchor" id="line-103"></span><p class="line874">Two ways: <span class="anchor" id="line-104"></span><span class="anchor" id="line-105"></span><p class="line867"><span class="anchor" id="line-106"></span><span class="anchor" id="line-107"></span><span class="anchor" id="line-108"></span><pre><span class="anchor" id="line-1-15"></span>basename /path/to/file
  174. <span class="anchor" id="line-2-9"></span>foo=/path/to/file ; echo ${foo##*/}</pre><span class="anchor" id="line-109"></span><p class="line867">
  175. <h2 id="How_do_I_test_whether_a_directory_has_files_in_it.3F">How do I test whether a directory has files in it?</h2>
  176. <span class="anchor" id="line-110"></span><p class="line867"><span class="anchor" id="line-111"></span><span class="anchor" id="line-112"></span><span class="anchor" id="line-113"></span><pre><span class="anchor" id="line-1-16"></span>if [ &quot;$(ls -A somedir)&quot; ]; then
  177. <span class="anchor" id="line-2-10"></span> echo &quot;It has files&quot;
  178. <span class="anchor" id="line-3-3"></span>fi</pre><span class="anchor" id="line-114"></span><p class="line862">Note: a single argument inside the brackets is equivalent to <tt>[&nbsp;-n&nbsp;argument&nbsp;]</tt>. There seems to be no clean way to do this using only shell builtins. (We had one earlier attempt which was close, but that failed if there was one file named * in the directory.) <span class="anchor" id="line-115"></span><span class="anchor" id="line-116"></span><p class="line874">Another way: <span class="anchor" id="line-117"></span><span class="anchor" id="line-118"></span><p class="line867"><span class="anchor" id="line-119"></span><span class="anchor" id="line-120"></span><span class="anchor" id="line-121"></span><pre><span class="anchor" id="line-1-17"></span>if [ &quot;$(ls -A somedir | wc -l)&quot; -gt 0 ]; then
  179. <span class="anchor" id="line-2-11"></span> echo &quot;found files&quot;
  180. <span class="anchor" id="line-3-4"></span>fi</pre><span class="anchor" id="line-122"></span><p class="line862">A shorter way: <tt>[&nbsp;$(ls&nbsp;-A&nbsp;somedir)&nbsp;]&nbsp;&amp;&amp;&nbsp;echo&nbsp;&quot;directory&nbsp;is&nbsp;not&nbsp;empty&quot;</tt> <span class="anchor" id="line-123"></span><span class="anchor" id="line-124"></span><p class="line874">Note: The double ampersand works like a boolean &quot;and&quot;, so the &quot;if&quot; is not required. <span class="anchor" id="line-125"></span><span class="anchor" id="line-126"></span><p class="line867">
  181. <h2 id="How_do_I_start_a_process_in_background.3F">How do I start a process in background?</h2>
  182. <span class="anchor" id="line-127"></span><p class="line874">Just append an ampersand: <span class="anchor" id="line-128"></span><span class="anchor" id="line-129"></span><pre><span class="anchor" id="line-1-18"></span>sleep 100 &amp;</pre><span class="anchor" id="line-130"></span><p class="line862">It prints a line that looks like: <tt>&nbsp;[1]&nbsp;6338&nbsp;</tt>, indicating that this process is job number 1 and that its process ID is 6338. <span class="anchor" id="line-131"></span><span class="anchor" id="line-132"></span><p class="line874">To kill this job: <span class="anchor" id="line-133"></span><span class="anchor" id="line-134"></span><pre><span class="anchor" id="line-1-19"></span>kill %1 </pre><span class="anchor" id="line-135"></span><p class="line862">or <span class="anchor" id="line-136"></span><pre><span class="anchor" id="line-1-20"></span>kill 6338 </pre><span class="anchor" id="line-137"></span><span class="anchor" id="line-138"></span><p class="line862">Note: If you have started many processes in background and you want to list them, type <tt>jobs</tt>. <span class="anchor" id="line-139"></span><span class="anchor" id="line-140"></span><p class="line874">You can also switch a job running in the background into the foreground, then suspend this job, and then restart this job to the background. <span class="anchor" id="line-141"></span>Let's start a process in the background: <span class="anchor" id="line-142"></span><span class="anchor" id="line-143"></span><pre><span class="anchor" id="line-1-21"></span>sleep 100 &amp;</pre><span class="anchor" id="line-144"></span><p class="line862">To move it to the foreground (assuming that this is job number 1): <span class="anchor" id="line-145"></span><pre><span class="anchor" id="line-1-22"></span>fg %1</pre><span class="anchor" id="line-146"></span><p class="line862">Then, press <em>Ctrl+Z</em>. This suspends the process and send it to the background. <span class="anchor" id="line-147"></span>Now, restart the suspended process while leaving it in the background:<span class="anchor" id="line-148"></span><pre><span class="anchor" id="line-1-23"></span>bg %1</pre><span class="anchor" id="line-149"></span><p class="line874">To kill this job: <span class="anchor" id="line-150"></span><span class="anchor" id="line-151"></span><pre><span class="anchor" id="line-1-24"></span>kill %1</pre><span class="anchor" id="line-152"></span><span class="anchor" id="line-153"></span><p class="line867">
  183. <h2 id="How_do_I_work_with_arrays_in_bash.3F">How do I work with arrays in bash?</h2>
  184. <span class="anchor" id="line-154"></span><p class="line874">Assigning to one: <span class="anchor" id="line-155"></span><span class="anchor" id="line-156"></span><p class="line867"><span class="anchor" id="line-157"></span><span class="anchor" id="line-158"></span><pre><span class="anchor" id="line-1-25"></span>arr=(one two three four)
  185. <span class="anchor" id="line-2-12"></span>myoggs=(*.ogg)</pre><span class="anchor" id="line-159"></span><p class="line874">Iterating over one: <span class="anchor" id="line-160"></span><span class="anchor" id="line-161"></span><p class="line867"><span class="anchor" id="line-162"></span><pre><span class="anchor" id="line-1-26"></span>for f in &quot;${myoggs[@]}&quot;; do ...; done</pre><span class="anchor" id="line-163"></span><p class="line874">Selecting a random element: <span class="anchor" id="line-164"></span><span class="anchor" id="line-165"></span><p class="line867"><span class="anchor" id="line-166"></span><span class="anchor" id="line-167"></span><span class="anchor" id="line-168"></span><pre><span class="anchor" id="line-1-27"></span>mysigs=($HOME/sigs/*)
  186. <span class="anchor" id="line-2-13"></span>cat ${mysigs[RANDOM % ${#mysigs[*]}]}</pre><span class="anchor" id="line-169"></span><p class="line874">(In the previous example, note that the brackets for the array index also force a numeric evaluation context, in which RANDOM doesn't need a leading $ sign.) <span class="anchor" id="line-170"></span><span class="anchor" id="line-171"></span><p class="line874">You can't easily &quot;delete&quot; an element from the middle of an array, but you can hack around it by reindexing the array to skip over all the unset elements: <span class="anchor" id="line-172"></span><span class="anchor" id="line-173"></span><p class="line867"><span class="anchor" id="line-174"></span><span class="anchor" id="line-175"></span><span class="anchor" id="line-176"></span><span class="anchor" id="line-177"></span><pre><span class="anchor" id="line-1-28"></span>arr=(zero one two three four)
  187. <span class="anchor" id="line-2-14"></span>unset arr[1]
  188. <span class="anchor" id="line-3-5"></span>arr=(&quot;${arr[@]}&quot;)</pre><span class="anchor" id="line-178"></span><p class="line862">This will also leave all the <em>empty</em> elements in place, deleting only the <em>unset</em> ones. <span class="anchor" id="line-179"></span><span class="anchor" id="line-180"></span><p class="line867">
  189. <h2 id="How_do_I_use_a_variable_within_a_variable_.28variable_interpolation.29_in_bash.3F">How do I use a variable within a variable (variable interpolation) in bash?</h2>
  190. <span class="anchor" id="line-181"></span><p class="line874">If you want to do something like ${$var}, use this format: ${!var} <span class="anchor" id="line-182"></span><span class="anchor" id="line-183"></span><p class="line874">So if you have: <span class="anchor" id="line-184"></span><span class="anchor" id="line-185"></span><p class="line867"><span class="anchor" id="line-186"></span><span class="anchor" id="line-187"></span><pre><span class="anchor" id="line-1-29"></span>FOO=one
  191. <span class="anchor" id="line-2-15"></span>BAR=FOO</pre><span class="anchor" id="line-188"></span><p class="line874">then ${!BAR} will return &quot;one&quot; <span class="anchor" id="line-189"></span><span class="anchor" id="line-190"></span><p class="line874">This only works for referencing an existing variable, not for assignment. If you wish to assign to a dynamically generated variable name, you must use either eval: <span class="anchor" id="line-191"></span><span class="anchor" id="line-192"></span><p class="line867"><span class="anchor" id="line-193"></span><span class="anchor" id="line-194"></span><span class="anchor" id="line-195"></span><pre><span class="anchor" id="line-1-30"></span>IFACE=eth0
  192. <span class="anchor" id="line-2-16"></span>eval IP_${IFACE}=192.168.1.1</pre><span class="anchor" id="line-196"></span><p class="line874">or, in many cases, just use an array: <span class="anchor" id="line-197"></span><span class="anchor" id="line-198"></span><p class="line867"><span class="anchor" id="line-199"></span><span class="anchor" id="line-200"></span><span class="anchor" id="line-201"></span><pre><span class="anchor" id="line-1-31"></span>N=17
  193. <span class="anchor" id="line-2-17"></span>ROW[N]=&quot;This is the 18th row (counting from 0).&quot;</pre><span class="anchor" id="line-202"></span><p class="line874">The eval trick can also be used for referencing: <span class="anchor" id="line-203"></span><span class="anchor" id="line-204"></span><p class="line867"><span class="anchor" id="line-205"></span><span class="anchor" id="line-206"></span><span class="anchor" id="line-207"></span><pre><span class="anchor" id="line-1-32"></span>IFACE=eth0
  194. <span class="anchor" id="line-2-18"></span>eval echo \$IP_${IFACE}</pre><span class="anchor" id="line-208"></span><p class="line874">The eval makes a second pass over the code. The first pass substitutes $ for \$ and then substitutes the value of ${IFACE}, leaving &quot;eval echo $IP_eth0&quot;. The second pass then substitutes the value of the ${IP_eth0} variable, assuming one exists. <span class="anchor" id="line-209"></span><span class="anchor" id="line-210"></span><p class="line867">
  195. <h2 id="How_do_I_count_the_lines_of_files_with_certain_extensions_in_a_certain_directory.3F">How do I count the lines of files with certain extensions in a certain directory?</h2>
  196. <span class="anchor" id="line-211"></span><p class="line867"><span class="anchor" id="line-212"></span><span class="anchor" id="line-213"></span><pre><span class="anchor" id="line-1-33"></span>find $dir -name *.[$extensions] -exec cat \{\} \; | wc -l</pre><span class="anchor" id="line-214"></span><p class="line874">finds the files in $dir with any of the extensions $extensions and reads the files using cat using 'wc -l' to count the lines of text. <span class="anchor" id="line-215"></span><span class="anchor" id="line-216"></span><p class="line874">You can so make <span class="anchor" id="line-217"></span><span class="anchor" id="line-218"></span><span class="anchor" id="line-219"></span><pre><span class="anchor" id="line-1-34"></span>wc -l $dir/*.$extensions</pre><span class="anchor" id="line-220"></span><span class="anchor" id="bottom"></span></div><div id="pagebottom"></div>
  197. </div>
  198. <div id="footer">
  199. <p id="pageinfo" class="info" lang="en" dir="ltr">ShellTricks (<a class="nbinfo" href="/ShellTricks?action=info" rel="nofollow">last modified 2015-10-30 21:39:58</a>)</p>
  200. <ul id="credits">
  201. <li><a href="https://www.debian.org/legal/privacy">Debian privacy policy</a><br></li><li><a href="https://moinmo.in/" title="This site uses the MoinMoin Wiki software.">MoinMoin Powered</a></li><li><a href="https://moinmo.in/Python" title="MoinMoin is written in Python.">Python Powered</a></li><li>Debian Wiki <a href="/Teams/DebianWiki">team</a>, <a href="https://bugs.debian.org/wiki.debian.org">bugs</a> and <a href="https://salsa.debian.org/debian/wiki.debian.org">config</a> available.</li><li>Hosting provided by <a href="https://www.man-da.de/">Metropolitan Area Network Darmstadt</a></li>
  202. </ul>
  203. </div>
  204. </body>
  205. </html>