📄 ch11_14.htm
字号:
<HTML><!--Distributed by F --><HEAD><TITLE>[Chapter 11] 11.14 More Ways to Do Interactive History Editing </TITLE><METANAME="DC.title"CONTENT="UNIX Power Tools"><METANAME="DC.creator"CONTENT="Jerry Peek, Tim O'Reilly & Mike Loukides"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1998-08-04T21:36:17Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-260-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch11_01.htm"TITLE="11. The Lessons of History"><LINKREL="prev"HREF="ch11_13.htm"TITLE="11.13 Shell Command-Line Editing "><LINKREL="next"HREF="ch11_15.htm"TITLE="11.15 Changing C Shell History Characters with histchars "></HEAD><BODYBGCOLOR="#FFFFFF"TEXT="#000000"><DIVCLASS="htmlnav"><H1><IMGSRC="gifs/smbanner.gif"ALT="UNIX Power Tools"USEMAP="#srchmap"BORDER="0"></H1><MAPNAME="srchmap"><AREASHAPE="RECT"COORDS="0,0,466,58"HREF="index.htm"ALT="UNIX Power Tools"><AREASHAPE="RECT"COORDS="467,0,514,18"HREF="jobjects/fsearch.htm"ALT="Search this book"></MAP><TABLEWIDTH="515"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch11_13.htm"TITLE="11.13 Shell Command-Line Editing "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 11.13 Shell Command-Line Editing "BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1">Chapter 11<BR>The Lessons of History</FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch11_15.htm"TITLE="11.15 Changing C Shell History Characters with histchars "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 11.15 Changing C Shell History Characters with histchars "BORDER="0"></A></TD></TR></TABLE> <HRALIGN="LEFT"WIDTH="515"TITLE="footer"></DIV><DIVCLASS="SECT1"><H2CLASS="sect1"><ACLASS="title"NAME="UPT-ART-9010">11.14 More Ways to Do Interactive History Editing </A></H2><PCLASS="para"><ACLASS="indexterm"NAME="AUTOID-13273"></A><ACLASS="indexterm"NAME="AUTOID-13275"></A><SPANCLASS="link"><EMCLASS="emphasis">tcsh</EM> (<ACLASS="linkend"HREF="ch08_03.htm"TITLE="Introduction to tcsh">8.3</A>)</SPAN>is a version of <EMCLASS="emphasis">csh</EM> that provides history editing (among otherthings).If you don't want to switch to <EMCLASS="emphasis">tcsh</EM>, you can simulate history editing using <EMCLASS="emphasis">redo</EM>.If you're using <EMCLASS="emphasis">bash</EM> or <EMCLASS="emphasis">ksh</EM>, you probably already know aboutyour shell's editing - but you may not know about its <EMCLASS="emphasis">fc</EM> command.</P><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="UPT-ART-9010-SECT-1.1">11.14.1 In the C Shell: redo </A></H3><PCLASS="para"><ACLASS="indexterm"NAME="AUTOID-13289"></A><ACLASS="indexterm"NAME="AUTOID-13291"></A><EMCLASS="emphasis">redo</EM> is a C shell script that is run by being<SPANCLASS="link">sourced (<ACLASS="linkend"HREF="ch44_23.htm"TITLE="Reading Files with the . and source Commands ">44.23</A>)</SPAN>into the current shell using an alias.The original version was posted to Usenet in the 1980s, author unknown.The version shown here was reposted in 1987 by Dave Patterson.The alias puts you in an <EMCLASS="emphasis">ex</EM><SPANCLASS="link">open-mode (<ACLASS="linkend"HREF="ch30_36.htm"TITLE="The ex Open Mode Can Be Handy ">30.36</A>)</SPAN>editing buffer, a comfortable environment for <EMCLASS="emphasis">vi</EM> users.You can browse through theprevious 22 commands and press RETURN when you wantto execute the current line.Before executing, youcan edit the commands as you would in <EMCLASS="emphasis">vi</EM>.You can even search for strings using <CODECLASS="literal">/</CODE>; just remember to press ESC instead of RETURN after the search string.</P><PCLASS="para">To use <EMCLASS="emphasis">redo</EM>, first install it <SPANCLASS="link">read-only with <EMCLASS="emphasis">no</EM> execute permission (<ACLASS="linkend"HREF="ch22_02.htm"TITLE="Tutorial on File and Directory Permissions ">22.2</A>)</SPAN>,and then create an alias with the script's<SPANCLASS="link">absolute pathname (<ACLASS="linkend"HREF="ch14_02.htm"TITLE="Using Relative and Absolute Pathnames ">14.2</A>)</SPAN>to execute it:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">alias r source ~/.lib/redo</PRE></BLOCKQUOTE></P><PCLASS="para">When you run the alias, it reads a set of commands from the<SPANCLASS="link">sourceable script file (<ACLASS="linkend"HREF="ch10_05.htm"TITLE="Sourceable Scripts ">10.5</A>)</SPAN>.</P><PCLASS="para">Here's the <EMCLASS="emphasis">redo</EM> script:</P><PCLASS="para"><TABLECLASS="screen.co"BORDER="1"><TR><THVALIGN="TOP"><PRECLASS="calloutlist"> <ACLASS="co"HREF="ch45_35.htm"TITLE="45.35 Using a Control Character in a Script ">echo...33'</A> <ACLASS="co"HREF="ch31_02.htm"TITLE="31.2 Save Time and Typing with the vi map Commands ">map</A> <ACLASS="co"HREF="ch25_14.htm"TITLE="25.14 How to Look at the End of a File: tail ">tail</A> <ACLASS="co"HREF="ch11_07.htm"TITLE="11.7 History Substitutions ">!...</A> </PRE></TH><TDVALIGN="TOP"><PRECLASS="screen"> history -h 22 >! /tmp/redo.$$# Put CR in $c[1] and ESC in $c[2]:set c=(`echo "m e" | tr me '\015\033'`)# Make CR map to :wq! and start ex quietly at 2nd to last line in open mode.(setenv EXINIT "map $c[1] :.wq\!$c[2]|map! $c[1] ${c[2]}:.wq\!$c[2]";\ ex '+$-1 open' /tmp/redo.$$)tail -1 /tmp/redo.$$ >! /tmp/cmd.$$# Insert into history without executing.source -h /tmp/cmd.$$# Clear out temporaries./bin/rm -f /tmp/{cmd,redo}.$$unset c# If thing chosen to redo is the redo alias itself then DON'T redo it.if (!-2:0 != !!:0) !!</PRE></TD></TR></TABLE></P><PCLASS="para">Type <CODECLASS="literal">r</CODE> to invoke the alias.Then use cursor motion keys (<CODECLASS="literal">jk</CODE>) to get to the line you want to edit.Edit the line (remember that you're in the<SPANCLASS="link">open mode (<ACLASS="linkend"HREF="ch30_36.htm"TITLE="The ex Open Mode Can Be Handy ">30.36</A>)</SPAN>of <EMCLASS="emphasis">ex</EM>).When you're done,press RETURN. (Don't type <CODECLASS="literal">ZZ</CODE> or <CODECLASS="literal">q</CODE>.)</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="UPT-ART-9010-SECT-1.2">11.14.2 In ksh and bash: fc </A></H3><PCLASS="para"><ACLASS="indexterm"NAME="AUTOID-13328"></A><ACLASS="indexterm"NAME="AUTOID-13330"></A><ACLASS="indexterm"NAME="AUTOID-13333"></A><ACLASS="indexterm"NAME="AUTOID-13336"></A><EMCLASS="emphasis">ksh</EM> and <EMCLASS="emphasis">bash</EM> have a built-in command called <EMCLASS="emphasis">fc</EM>(for "fix command").It's like <EMCLASS="emphasis">redo</EM>, but more powerful.We'll cover the basics here; check your shell's manpage or itsNutshell Handbook for details.</P><PCLASS="para">To see a list of your previous commands, use the option <CODECLASS="literal">-l</CODE> (lowercase L,for "list"):</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">$ <CODECLASS="userinput"><B>fc -l</B></CODE> ...19 ls -F20 less expn.c21 vi $_22 make23 expn info@ora.com24 fc -l</PRE></BLOCKQUOTE></P><PCLASS="para">To get a shorter list, give <EMCLASS="emphasis">fc</EM> the first number or name you wantto list.For instance, <CODECLASS="literal">fc -l vi</CODE> or <CODECLASS="literal">fc -l 21</CODE> would give the lastfour lines above.</P><PCLASS="para"><EMCLASS="emphasis">fc</EM> can call a UNIX editor (<EMCLASS="emphasis">vi</EM>, <EMCLASS="emphasis">emacs</EM>, <EMCLASS="emphasis">pico</EM>, etc.)to edit one or more of the previous commands.You can name an editor with the <EMCLASS="emphasis">-e</EM> option each time you use <EMCLASS="emphasis">fc</EM>,but it's probably easier to store the editor in the <EMCLASS="emphasis">FCEDIT</EM> shellvariable (in your<SPANCLASS="link"><EMCLASS="emphasis">.profile</EM> or <EMCLASS="emphasis">.bashrc</EM> files (<ACLASS="linkend"HREF="ch02_02.htm"TITLE="Shell Setup Files-Which, Where, and Why ">2.2</A>)</SPAN>).</P><PCLASS="para">To edit the commands above, between <CODECLASS="literal">vi</CODE> and <CODECLASS="literal">expn</CODE>,you would type <CODECLASS="literal">fc v e</CODE> or <CODECLASS="literal">fc 21 23</CODE>.Your editor will start with the three command lines in it.You can make any changes you want: add commands, rearrange them,and so on.When you exit the editor, the commands you saved with your editorwill be executed.If you change your mind and don't want to execute anything, just deleteall lines in your editor before you save - or replace them with a dummycommand like <CODECLASS="literal">echo hi</CODE>.</P></DIV><DIVCLASS="sect1info"><PCLASS="SECT1INFO">- <SPANCLASS="authorinitials">LM</SPAN>, <SPANCLASS="authorinitials">JP</SPAN></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="515"TITLE="footer"><TABLEWIDTH="515"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch11_13.htm"TITLE="11.13 Shell Command-Line Editing "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 11.13 Shell Command-Line Editing "BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><ACLASS="book"HREF="index.htm"TITLE="UNIX Power Tools"><IMGSRC="gifs/txthome.gif"SRC="gifs/txthome.gif"ALT="UNIX Power Tools"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch11_15.htm"TITLE="11.15 Changing C Shell History Characters with histchars "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 11.15 Changing C Shell History Characters with histchars "BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172">11.13 Shell Command-Line Editing </TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><ACLASS="index"HREF="index/idx_0.htm"TITLE="Book Index"><IMGSRC="gifs/index.gif"SRC="gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172">11.15 Changing C Shell History Characters with histchars </TD></TR></TABLE><HRALIGN="LEFT"WIDTH="515"TITLE="footer"><IMGSRC="gifs/smnavbar.gif"SRC="gifs/smnavbar.gif"USEMAP="#map"BORDER="0"ALT="The UNIX CD Bookshelf Navigation"><MAPNAME="map"><AREASHAPE="RECT"COORDS="0,0,73,21"HREF="../index.htm"ALT="The UNIX CD Bookshelf"><AREASHAPE="RECT"COORDS="74,0,163,21"HREF="index.htm"ALT="UNIX Power Tools"><AREASHAPE="RECT"COORDS="164,0,257,21"HREF="../unixnut/index.htm"ALT="UNIX in a Nutshell"><AREASHAPE="RECT"COORDS="258,0,321,21"HREF="../vi/index.htm"ALT="Learning the vi Editor"><AREASHAPE="RECT"COORDS="322,0,378,21"HREF="../sedawk/index.htm"ALT="sed & awk"><AREASHAPE="RECT"COORDS="379,0,438,21"HREF="../ksh/index.htm"ALT="Learning the Korn Shell"><AREASHAPE="RECT"COORDS="439,0,514,21"HREF="../lrnunix/index.htm"ALT="Learning the UNIX Operating System"></MAP></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -