<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>misto's blog &#187; shell</title>
	<atom:link href="http://blog.misto.ch/archives/tag/shell/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.misto.ch</link>
	<description>blog über mich und interessante dinge aus dem alltag. oft auch etwas aus der informatik</description>
	<lastBuildDate>Sun, 06 Sep 2009 14:01:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SMS senden leicht gemacht (Orange)</title>
		<link>http://blog.misto.ch/archives/606</link>
		<comments>http://blog.misto.ch/archives/606#comments</comments>
		<pubDate>Sat, 21 Jun 2008 15:18:22 +0000</pubDate>
		<dc:creator>misto</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[hackers]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tipp]]></category>

		<guid isPermaLink="false">http://blog.misto.ch/?p=606</guid>
		<description><![CDATA[Gibt es was mühsameres, als die unsäglichen Browser-SMS-Versende-Dienste unserer Mobilfunkanbieter? Naja, wahrscheinlich gibt es schlimmeres, aber verbessern kann man es ja trotzdem. Das Ziel ist, möglichst einfach SMS zu versenden, also schreiben wir doch ein Script, welches als Parameter Nummer und Text entgegennimmt und versendet.
Ist eigentlich ganz einfach, Mechanize mimt einen Browser und macht genau [...]]]></description>
			<content:encoded><![CDATA[<p>Gibt es was mühsameres, als die unsäglichen Browser-SMS-Versende-Dienste unserer Mobilfunkanbieter? Naja, wahrscheinlich gibt es schlimmeres, aber verbessern kann man es ja trotzdem. Das Ziel ist, möglichst einfach SMS zu versenden, also schreiben wir doch ein Script, welches als Parameter Nummer und Text entgegennimmt und versendet.</p>
<p>Ist eigentlich ganz einfach, Mechanize mimt einen Browser und macht genau das, was auch ein Mensch tun würde, also anmelden, Formularfelder ausfüllen und abschicken:</p>
<pre>
<span class="PreProc">#!/usr/bin/ruby</span>
<span class="PreProc">require</span> <span class="Special">'</span><span class="Constant">mechanize</span><span class="Special">'</span>

username = <span class="Special">'</span><span class="Constant">mirkostocker</span><span class="Special">'</span>
password = <span class="Special">'</span><span class="Constant">XXXXXXXXXXXX</span><span class="Special">'</span>
number   = <span class="Identifier">ARGV</span>.shift
message  = <span class="Identifier">ARGV</span> * <span class="Special">&quot;</span><span class="Constant"> </span><span class="Special">&quot;</span>

<span class="Statement">if</span> message.length &gt; <span class="Constant">144</span> || message.length &lt; <span class="Constant">1</span>
  <span class="Identifier">$stderr</span>.puts <span class="Special">&quot;</span><span class="Constant">Nachricht zu lang oder zu kurz..</span><span class="Special">&quot;</span>
  <span class="Statement">exit</span> <span class="Constant">1</span>
<span class="Statement">end</span>

<span class="PreProc">def</span> <span class="Identifier">find_form_with_field</span>(page, fieldname)
  page.forms.each <span class="Statement">do</span> |<span class="Identifier">form</span>|
    <span class="Statement">if</span> form.fields.find{|<span class="Identifier">f</span>| f.name == fieldname}
      <span class="Statement">yield</span> form
    <span class="Statement">end</span>
  <span class="Statement">end</span>
<span class="PreProc">end</span>

<span class="Type">WWW</span>::<span class="Type">Mechanize</span>.new <span class="Statement">do</span> |<span class="Identifier">agent</span>|

  agent.get(<span class="Special">'</span><span class="Constant"><a href="https://www.orange.ch/footer/login">https://www.orange.ch/footer/login</a></span><span class="Special">'</span>) <span class="Statement">do</span> |<span class="Identifier">page</span>|

    find_form_with_field(page, <span class="Special">'</span><span class="Constant">username</span><span class="Special">'</span>) <span class="Statement">do</span> |<span class="Identifier">f</span>|
      f.username = username
      f.password = password
      f.submit
    <span class="Statement">end</span>
  <span class="Statement">end</span>

  agent.get(<span class="Special">'</span><span class="Constant"><a href="https://www.orange.ch/myorange/sms">https://www.orange.ch/myorange/sms</a></span><span class="Special">'</span>) <span class="Statement">do</span> |<span class="Identifier">page</span>|

    find_form_with_field(page, <span class="Special">'</span><span class="Constant">messageInput</span><span class="Special">'</span>) <span class="Statement">do</span> |<span class="Identifier">f</span>|
      f.destinationNumberInput = number
      f.messageInput = message
      f.wui_target_id = <span class="Special">'</span><span class="Constant">sendButton</span><span class="Special">'</span>
      f.wui_event_id = <span class="Special">'</span><span class="Constant">onclick</span><span class="Special">'</span>
      f.submit
    <span class="Statement">end</span>
  <span class="Statement">end</span>
<span class="Statement">end</span>
</pre>
<p><br/></p>
<p><em>find_form_with_field</em> musste ich schreiben, da die Formulare keine Namen besitzen, und fragt mich nicht, weshalb ich <em>wui_target_id</em> und <em>wui_event_id</em> setzen muss, im echten Browser wird das per Javascript gemacht und ist anscheinend wichtig. Hat auch gleich die Projektdauer um 50% verlängert, auf rund 1.5 Stunden.</p>
<p>So, und wer kümmert sich um die <strong>Swisscom</strong> und <strong>Sunrise</strong>?</p>
<p>Guido: Wie du siehst habe ich einen netten Weg gefunden, bunten Code zu bloggen, <a href="http://www.vim.org/">der beste Editor der Welt</a> hat nämlich eine TOhtml Funktion.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.misto.ch/archives/606/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Shell: ssh</title>
		<link>http://blog.misto.ch/archives/470</link>
		<comments>http://blog.misto.ch/archives/470#comments</comments>
		<pubDate>Wed, 16 Jan 2008 17:56:52 +0000</pubDate>
		<dc:creator>misto</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tipp]]></category>

		<guid isPermaLink="false">http://blog.misto.ch/archives/470</guid>
		<description><![CDATA[Ich hab schon lange nichts mehr hierüber geschrieben, die &#8220;einfachen&#8221; Themen sind ja auch schon durch. Eines der wohl nützlichsten Tools neben den coreutils ist für mich ssh, da man damit extrem flexibel ist. Von überall her ist man ohne grossen Aufwand auf einem beliebigen Rechner und arbeitet damit genau gleich, als wäre man lokal [...]]]></description>
			<content:encoded><![CDATA[<p>Ich hab schon lange nichts mehr hierüber geschrieben, die &#8220;einfachen&#8221; Themen sind ja auch schon durch. Eines der wohl nützlichsten Tools neben den <a href="http://www.gnu.org/software/coreutils/manual/html_node/index.html">coreutils</a> ist für mich ssh, da man damit extrem flexibel ist. Von überall her ist man ohne grossen Aufwand auf einem beliebigen Rechner und arbeitet damit genau gleich, als wäre man lokal am Gerät. Ok, das wissen die meisten wohl bereits. Es gibt aber noch ein paar Dinge, die einem das Leben mit ssh noch einfacher machen, davon soll dieser Beitrag handeln.</p>
<h4>Authentifizerung mit Public-Key (in 2 Schritten)</h4>
<p>Als erstes braucht man natürlich ein Schlüsselpaar, dies erstellt man mit <code>ssh-keygen</code> Wer mutig ist kann das Passwort auch einfach leer lassen. Für jeden Rechner, an dem man sich nun damit anmelden will, ist nur noch folgendes zu tun: <code>ssh $host "mkdir -p .ssh; cat >> .ssh/authorized_keys" < .ssh/id_rsa.pub</code>Dabei wird auf dem Server das entsprechende Verzeichnis erstellt, falls es noch nicht existiert und danach unseren Public-Key angehängt. Das wars schon! Wenn man das Passwort (für den Schlüssel) nicht jedes Mal eintippen will, dann lohnt es sich, den "ssh agent" einzusetzen. Da dessen Konfiguration jedoch Distributionsabhängig ist, verzichte ich auf eine Erläuterung.</p>
<h4>Konfiguration pro Host</h4>
<p>Leider kann man sich den Usernamen, den man auf einem Rechner hat, nicht immer aussuchen. Natürlich könnte man sich immer mit user@host verbinden, aber das ist eigentlich unnötig, viel eleganter ist es, die Host-Spezifische Konfiguration in <tt>.ssh/config</tt> einzutragen. Bei mir sieht die Beispielsweise so aus:<br />
<code>Host dnd<br />
HostName dnd.ch<br />
User mstocker<br/><br />
Host r2<br />
HostName r2.ifs.hsr.ch</code></p>
<p>Sollte eigentlich selbsterklärend sein. Für die Verbindung reicht nun ein 'ssh dnd' oder 'ssh r2'.</p>
<h4>Tunnels</h4>
<p>Wenn man einen mühsamen Admin hat, der einem alle möglichen Ports zumacht, kann man dies ziemlich einfach umgehen, und zwar mit local port forwarding.</p>
<p>Nehmen wir an, wir haben einen Laptop im HSR-Netz und würden gerne auf server1:8080 verbinden. Zuhause haben wir einen Rechner stehen, den wir per ssh erreichen können, und welcher auch server1:8080 errreicht. Mit folgendem Befehl wird nun ein Tunnel über den Server zu Hause nach server1:8080 erstellt:<code> ssh -L 80:server1:8080 server_zu_hause</code>Im Browser über localhost:80 ist server1 nun erreichbar. Ist doch eigentlich ganz einfach! <img src='http://blog.misto.ch/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Mit ssh kann man noch viel wildere Dinge tun, wie z.B. Reverse-Tunnels, mit denen man beispielsweise von zu Hause aus auf den PC im Büro zugreifen kann. Und seit OpenSSH 4.3 sind sogar ganze VPNs möglich...</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.misto.ch/archives/470/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shell: cd</title>
		<link>http://blog.misto.ch/archives/464</link>
		<comments>http://blog.misto.ch/archives/464#comments</comments>
		<pubDate>Wed, 31 Oct 2007 21:13:21 +0000</pubDate>
		<dc:creator>misto</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tipp]]></category>

		<guid isPermaLink="false">http://blog.misto.ch/archives/464</guid>
		<description><![CDATA[The cd utility shall change the working directory of the current shell  execution environment &#8230;
So beginnt die man-Page zum Befehl &#8220;cd&#8221;, und das wichtigste ist damit eigentlich auch schon fast gesagt. Cd ist wohl ein Befehl, der jeder schon mal gebrauch hat, aber wohl meistens in der Form &#8220;cd $Verzeichnis&#8221;. Man kann allerdings noch [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>The cd utility shall change the working directory of the current shell  execution environment &#8230;</p></blockquote>
<p>So beginnt die man-Page zum Befehl &#8220;cd&#8221;, und das wichtigste ist damit eigentlich auch schon fast gesagt. Cd ist wohl ein Befehl, der jeder schon mal gebrauch hat, aber wohl meistens in der Form &#8220;cd $Verzeichnis&#8221;. Man kann allerdings noch viel mehr damit machen:</p>
<ul>
<li>&#8220;cd&#8221; ohne Argument bringt einem zurück nach $HOME</li>
<li>&#8220;cd -&#8221; bringt einem in das vorherige Verzeichnis zurück</li>
</ul>
<p>Noch ein Tipp für *zsh*-User: Mit den folgenden Einträgen (falls noch nicht vorhanden) in der .zshrc lässt sich mit &#8220;cd -[Tab]&#8221; die Liste der zuletzt besuchten Verzeichnisse durchgehen:</p>
<pre><code>setopt auto_pushd
zstyle ':completion:*' menu select=1
autoload -Uz compinit; compinit</code></pre>
<p>Noch was ganz abgefahrenes: Mit der Umgebungsvariable CDPATH lassen sich, separiert mit einem Doppelpunkt, Verzeichnisse angeben, in deren Unterverzeichnisse man direkt mit cd $Unterverzeichnis wechseln kann. Hm, keine Ahnung ob man das jetzt versteht, machen wir am besten ein Beispiel:</p>
<pre><code>export CDPATH=$HOME:/var/www/localhost/htdocs/</code></pre>
<p>Ich befinde mich in /, der Inhalt von $HOME ist:</p>
<pre><code>files  incoming  rssimap</code></pre>
<p>und von /var/www/localhost/htdocs:</p>
<pre><code>awstats  cacti</code></pre>
<p>Mit cd [Tab] erscheint nun folgende Liste, welche alle Unterverzeichnisse der 3 Verzeichnisse beinhaltet:</p>
<pre><code>awstats/   cacti/     files/     lib/       portage/   rssimap/   tmp/
bin/       dev/       home/      mnt/       proc/      sbin/      usr/
boot/      etc/       incoming/  opt/       root/      sys/       var/</code></pre>
<p>Cool, nicht?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.misto.ch/archives/464/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Shell: Befehle Wiederholen / History, Teil 2</title>
		<link>http://blog.misto.ch/archives/457</link>
		<comments>http://blog.misto.ch/archives/457#comments</comments>
		<pubDate>Sun, 21 Oct 2007 14:23:49 +0000</pubDate>
		<dc:creator>misto</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tipp]]></category>

		<guid isPermaLink="false">http://blog.misto.ch/archives/457</guid>
		<description><![CDATA[Im letzten Teil ging es ja bereits darum, möglichst einfach Befehle zu wiederholen. Sehr oft will man jedoch bloss ein Argument &#8220;wiederverwenden&#8221;, also beispielsweise einen Pfad.
Um das letzte Argument (wenns kein Argument hatte dann auch einfach den Befehl) zu wiederholen, tippt man stattdessen einfach das etwas kryptisch aussehende
!$ Es gibt noch einen ganzen Haufen von [...]]]></description>
			<content:encoded><![CDATA[<p>Im <a href="http://blog.misto.ch/archives/454">letzten Teil</a> ging es ja bereits darum, möglichst einfach Befehle zu wiederholen. Sehr oft will man jedoch bloss ein Argument &#8220;wiederverwenden&#8221;, also beispielsweise einen Pfad.</p>
<p>Um das letzte Argument (wenns kein Argument hatte dann auch einfach den Befehl) zu wiederholen, tippt man stattdessen einfach das etwas kryptisch aussehende<br />
<code>!$</code> Es gibt noch einen ganzen Haufen von Möglichkeiten auf spezifische Elemente zuzugreifen, also etwa das 2. Argument des vorletzten Befehls, aber die Syntax dazu kann ich mir nie recht merken.</p>
<p>Wenn man auf die letzten Argumente von weiter zurückliegenden Befehlen zugreifen will, kann man sich auch mit Alt^. recht komfortabel durchwühlen.</p>
<p>Mir geschieht es häufig, dass ich vergesse, gewisse Optionen anzugeben (-r beim Kopieren beispielsweise, oder -rf beim Löschen). Dafür habe ich mir die folgende Funktion (einfach nach .zshrc kopieren) geschrieben, welche den vorherigen Befehl holt, an den Anfang der Zeile springt, ein Wort nach vorne geht und auch schon vorsorglich rechts einen Abstand einfügt:</p>
<pre><code>previous_line_after_first_word () {
        zle up-line-or-history
        zle beginning-of-line
        zle vi-forward-word
        RBUFFER=" $RBUFFER"
}
zle -N previous_line_after_first_word
bindkey ^O previous_line_after_first_word</code></pre>
<p>Das ganze habe ich auf Ctrl^O gelegt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.misto.ch/archives/457/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Shell: Befehle Wiederholen / History</title>
		<link>http://blog.misto.ch/archives/454</link>
		<comments>http://blog.misto.ch/archives/454#comments</comments>
		<pubDate>Sun, 14 Oct 2007 10:34:01 +0000</pubDate>
		<dc:creator>misto</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tipp]]></category>

		<guid isPermaLink="false">http://blog.misto.ch/archives/454</guid>
		<description><![CDATA[Im letzten Beitrag ging es um die Navigation auf der aktuellen Eingabezeile, heute weiten wir das aus auf die gesamte History.
Mit dem Befehl $ history lassen sich, je nach Konfiguration, die letzten x-hundert ausgeführten Befehle anzeigen, jeweils mit einer Nummer versehen:

Möchte man nun einen Befehl nochmals ausführen, beispielsweise &#8220;kcmshell style&#8221;, genügt es, folgendes zu schreiben:
$ [...]]]></description>
			<content:encoded><![CDATA[<p>Im <a href="/archives/449?phpMyAdmin=62923875f647e39ca4151a4c56689383">letzten Beitrag</a> ging es um die Navigation auf der aktuellen Eingabezeile, heute weiten wir das aus auf die gesamte History.</p>
<p>Mit dem Befehl <code>$ history</code> lassen sich, je nach Konfiguration, die letzten x-hundert ausgeführten Befehle anzeigen, jeweils mit einer Nummer versehen:</p>
<p><img src='http://blog.misto.ch/wp-content/konsole_history.png' alt='konsole_history.png' /></p>
<p>Möchte man nun einen Befehl nochmals ausführen, beispielsweise &#8220;kcmshell style&#8221;, genügt es, folgendes zu schreiben:<br />
<code>$ !487</code></p>
<p>Wenn man die ZShell benützt, kann man mit Tab den Befehl auch schon mal vervollständigen.</p>
<p>Mal unter uns, ich nutze die History so eigentlich nicht sehr oft, denn viel einfacher ist es, einfach darin zu suchen. Mit Ctrl^R leitet man die Suche ein, dann einen Teil des Befehls den man sucht eintippen und mit Enter ausführen. Falls der Falsche, also ein neuerer Befehl, auch auf das Suchmuster zutrifft und man nicht noch mehr tippen möchte, kann man mit erneutem Ctrl^R durch die Suchresultate blättern (und mit Ctrl^S übrigens auch wieder noch vorne).</p>
<p>Wenn ich also Beispielsweise an meinem Webserver arbeite, ab und zu eine Konfigurationsdatei verändere und immer mal wieder den Apache neustarten muss, dann reicht es meistens, Ctrl^R res zu tippen und fertig.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.misto.ch/archives/454/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Shell: Navigation und Editieren der aktuellen Zeile</title>
		<link>http://blog.misto.ch/archives/449</link>
		<comments>http://blog.misto.ch/archives/449#comments</comments>
		<pubDate>Sat, 06 Oct 2007 16:10:28 +0000</pubDate>
		<dc:creator>misto</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tipp]]></category>

		<guid isPermaLink="false">http://blog.misto.ch/archives/449</guid>
		<description><![CDATA[Ich hätte nicht gedacht, dass sich so viele auf meinen Aufruf melden würden, anscheinend ist wirklich ein Bedürfnis und Interesse da, was mich natürlich freut. Ich hoffe, ich habe nicht allzu grosse Erwartungen geweckt. Es werden bestimmt auch ein paar Leute mitlesen, die viel mehr Wissen als ich, wenn etwas also mal noch einfacher geht [...]]]></description>
			<content:encoded><![CDATA[<p>Ich hätte nicht gedacht, dass sich so viele auf meinen <a href="/archives/447?phpMyAdmin=62923875f647e39ca4151a4c56689383">Aufruf</a> melden würden, anscheinend ist wirklich ein Bedürfnis und Interesse da, was mich natürlich freut. Ich hoffe, ich habe nicht allzu grosse Erwartungen geweckt. Es werden bestimmt auch ein paar Leute mitlesen, die viel mehr Wissen als ich, wenn etwas also mal noch einfacher geht oder nicht ganz korrekt ist, bitte ich darum korrigiert zu werden.</p>
<p>Vielleicht zuerst noch was zum Thema Shell: Ich selbst benutze <a href="http://www.zsh.org/">Zsh</a>, da sie sehr viele praktische Features bietet, die ich z.B. von der Bash nicht kenne. Ich möchte aber keine Flamewars zu dem Thema lostreten, eine schöne Liste von Vorteilen findet man <a href="http://www.michael-prokop.at/computer/tools_zsh.html">hier</a>. Wer nur deshalb die Bash benutzt, weil die einfach schon als Standardshell eingerichtet ist, dem empfehle ich einfach mal auf die Zsh zu wechseln:</p>
<p><code> $ sudo aptitude install zsh</code><br />
oder<br />
<code> $ sudo emerge zsh</code><br />
als default setzen:<br />
<code> $ chsh -s /bin/zsh #oder wo auch immer zsh liegt</code></p>
<p>Achtung, falls Einstellungen (z.B. Aliasse) in .bashrc gemacht wurden, müssen diese nach .zshrc migriert werden, die Syntax ist meistens ziemlich gleich. Ausserdem wird beim ersten Start ein Wizard der Zsh starten, wer Lust und Zeit sollte ruhig mal ein bisschen damit rumspielen.</p>
<p>Ok, nun aber zurück zum Hauptthema: Navigation. Dass man mit Cursor-Up die vorherigen Befehle &#8220;holen&#8221; kann ist (hoffentlich) allen klar. Vielleicht hat man einen Tippfehler gemacht oder ein sudo vergessen und muss noch was ändern. Natürlich kann man dazu die Cursortasten nehmen, an den Anfang der Zeile kommt man aber am einfachsten mit Ctrl^A (Achtung, das ist eigenltich ein kleines a, also ohne Shift). Ans Ende wiederum mit Ctrl^E (man muss sich aber nicht am Ende der Zeile befinden, um einen Befehl abzusetzen). Natürlich kann man das gleiche auch mit den Home und End-Tasten erreichen.</p>
<p>Nützlicher ist die Navigation mit Alt^B sowieo Alt^F, damit springt der Cursor vor (bzw. nach) das letzte (bzw. das nächste) Leerzeichen. Mit Ctrl^B und F bewegt man den Cursor bloss um ein Zeichen, was ich nicht besonders nützlich finde, deshalb habe ich diese Tasten mit der gleichen Funktion wie Alt^B / F belegt:</p>
<pre><code>#In .zshrc
bindkey ^F forward-word
bindkey ^B backward-word</code></pre>
<p>Nun können wir uns also schon ganz gut bewegen, allerdings wollen wir häufig auch noch was ändern. Mit Ctrl^W löscht man von der Cursorposition bis zum vorherigen Leerzeichen, das Umgekehrte, also &#8220;nach vorne&#8221; löschen geschieht mit Alt^D. Mit Ctrl^U löscht man gleich bis zum Anfang und mit Ctrl^K bis ans Ende der Zeile.</p>
<p>Machen wir doch ein Beispiel. Wir haben zuvor folgenden Befehl ausgeführt:<br />
<code>$ less /etc/apache2/httpd.conf</code><br />
Nun wollen wir die Datei bearbeiten, dazu drücken wir einfach Cursor-Up (oder Ctrl^P), Ctrl^BW (oder Ctrl^AFW, Ctrl^A Alt^D): &#8220;less&#8221; ist weg und kann mit einem anderen Befehl ersetzt werden.</p>
<p>Ziemlich simpel, aber einiges schneller als Zeichen-für-Zeichen zu navigieren. Einfach immer, wenn man sich dabei ertappt wie man ein dutzend Mal auf die Cursortasten haut, kurz an die paar Shortcuts erinnern und anwenden. Auch wenn man so zu Beginn vielleicht nicht schneller ist, wird man das mit der Zeit wieder rausholen. Ist im Prinzip dasselbe wie mit Vi <img src='http://blog.misto.ch/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . </p>
<p>[ratings]</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.misto.ch/archives/449/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
