📄 ash.c
字号:
union node *body;};struct narg { int type; union node *next; char *text; struct nodelist *backquote;};struct nfile { int type; union node *next; int fd; union node *fname; char *expfname;};struct ndup { int type; union node *next; int fd; int dupfd; union node *vname;};struct nhere { int type; union node *next; int fd; union node *doc;};struct nnot { int type; union node *com;};union node { int type; struct nbinary nbinary; struct ncmd ncmd; struct npipe npipe; struct nredir nredir; struct nif nif; struct nfor nfor; struct ncase ncase; struct nclist nclist; struct narg narg; struct nfile nfile; struct ndup ndup; struct nhere nhere; struct nnot nnot;};struct nodelist { struct nodelist *next; union node *n;};struct backcmd { /* result of evalbackcmd */ int fd; /* file descriptor to read from */ char *buf; /* buffer */ int nleft; /* number of chars in buffer */ struct job *jp; /* job structure for command */};struct cmdentry { int cmdtype; union param { int index; union node *func; const struct builtincmd *cmd; } u;};struct strlist { struct strlist *next; char *text;};struct arglist { struct strlist *list; struct strlist **lastp;};struct strpush { struct strpush *prev; /* preceding string on stack */ char *prevstring; int prevnleft;#ifdef CONFIG_ASH_ALIAS struct alias *ap; /* if push was associated with an alias */#endif char *string; /* remember the string since it may change */};struct parsefile { struct parsefile *prev; /* preceding file on stack */ int linno; /* current line */ int fd; /* file descriptor (or -1 if string) */ int nleft; /* number of chars left in this line */ int lleft; /* number of chars left in this buffer */ char *nextc; /* next char in buffer */ char *buf; /* input buffer */ struct strpush *strpush; /* for pushing strings at this level */ struct strpush basestrpush; /* so pushing one is fast */};struct stackmark { struct stack_block *stackp; char *stacknxt; int stacknleft; struct stackmark *marknext;};struct shparam { int nparam; /* # of positional parameters (without $0) */ unsigned char malloc; /* if parameter list dynamically allocated */ char **p; /* parameter list */ int optind; /* next parameter to be processed by getopts */ int optoff; /* used by getopts */};/* * When commands are first encountered, they are entered in a hash table. * This ensures that a full path search will not have to be done for them * on each invocation. * * We should investigate converting to a linear search, even though that * would make the command name "hash" a misnomer. */#define CMDTABLESIZE 31 /* should be prime */#define ARB 1 /* actual size determined at run time */struct tblentry { struct tblentry *next; /* next entry in hash chain */ union param param; /* definition of builtin function */ short cmdtype; /* index identifying command */ char rehash; /* if set, cd done since entry created */ char cmdname[ARB]; /* name of command */};static struct tblentry *cmdtable[CMDTABLESIZE];static int builtinloc = -1; /* index in path of %builtin, or -1 */static int exerrno = 0; /* Last exec error */static void tryexec(char *, char **, char **);static void printentry(struct tblentry *, int);static void clearcmdentry(int);static struct tblentry *cmdlookup(const char *, int);static void delete_cmd_entry(void);static int path_change(const char *, int *);static void flushall(void);static void out2fmt(const char *, ...) __attribute__ ((__format__(__printf__, 1, 2)));static int xwrite(int, const char *, int);static inline void outstr(const char *p, FILE * file){ fputs(p, file);}static void out1str(const char *p){ outstr(p, stdout);}static void out2str(const char *p){ outstr(p, stderr);}#ifndef CONFIG_ASH_OPTIMIZE_FOR_SIZE#define out2c(c) putc((c), stderr)#elsestatic void out2c(int c){ putc(c, stderr);}#endif#ifdef CONFIG_ASH_OPTIMIZE_FOR_SIZE#define USE_SIT_FUNCTION#endif/* number syntax index */#define BASESYNTAX 0 /* not in quotes */#define DQSYNTAX 1 /* in double quotes */#define SQSYNTAX 2 /* in single quotes */#define ARISYNTAX 3 /* in arithmetic */static const char S_I_T[][4] = { {CSPCL, CIGN, CIGN, CIGN}, /* 0, PEOA */ {CSPCL, CWORD, CWORD, CWORD}, /* 1, ' ' */ {CNL, CNL, CNL, CNL}, /* 2, \n */ {CWORD, CCTL, CCTL, CWORD}, /* 3, !*-/:=?[]~ */ {CDQUOTE, CENDQUOTE, CWORD, CDQUOTE}, /* 4, '"' */ {CVAR, CVAR, CWORD, CVAR}, /* 5, $ */ {CSQUOTE, CWORD, CENDQUOTE, CSQUOTE}, /* 6, "'" */ {CSPCL, CWORD, CWORD, CLP}, /* 7, ( */ {CSPCL, CWORD, CWORD, CRP}, /* 8, ) */ {CBACK, CBACK, CCTL, CBACK}, /* 9, \ */ {CBQUOTE, CBQUOTE, CWORD, CBQUOTE}, /* 10, ` */ {CENDVAR, CENDVAR, CWORD, CENDVAR}, /* 11, } */#ifndef USE_SIT_FUNCTION {CENDFILE, CENDFILE, CENDFILE, CENDFILE}, /* 12, PEOF */ {CWORD, CWORD, CWORD, CWORD}, /* 13, 0-9A-Za-z */ {CCTL, CCTL, CCTL, CCTL} /* 14, CTLESC ... */#endif};#ifdef USE_SIT_FUNCTION#define U_C(c) ((unsigned char)(c))static int SIT(int c, int syntax){ static const char spec_symbls[] = "\t\n !\"$&'()*-/:;<=>?[\\]`|}~"; static const char syntax_index_table[] = { 1, 2, 1, 3, 4, 5, 1, 6, /* "\t\n !\"$&'" */ 7, 8, 3, 3, 3, 3, 1, 1, /* "()*-/:;<" */ 3, 1, 3, 3, 9, 3, 10, 1, /* "=>?[\\]`|" */ 11, 3 }; /* "}~" */ const char *s; int indx; if (c == PEOF) /* 2^8+2 */ return CENDFILE; if (c == PEOA) /* 2^8+1 */ indx = 0; else if (U_C(c) >= U_C(CTLESC) && U_C(c) <= U_C(CTLQUOTEMARK)) return CCTL; else { s = strchr(spec_symbls, c); if (s == 0) return CWORD; indx = syntax_index_table[(s - spec_symbls)]; } return S_I_T[indx][syntax];}#else /* USE_SIT_FUNCTION */#define SIT(c, syntax) S_I_T[(int)syntax_index_table[((int)c)+SYNBASE]][syntax]#define CSPCL_CIGN_CIGN_CIGN 0#define CSPCL_CWORD_CWORD_CWORD 1#define CNL_CNL_CNL_CNL 2#define CWORD_CCTL_CCTL_CWORD 3#define CDQUOTE_CENDQUOTE_CWORD_CDQUOTE 4#define CVAR_CVAR_CWORD_CVAR 5#define CSQUOTE_CWORD_CENDQUOTE_CSQUOTE 6#define CSPCL_CWORD_CWORD_CLP 7#define CSPCL_CWORD_CWORD_CRP 8#define CBACK_CBACK_CCTL_CBACK 9#define CBQUOTE_CBQUOTE_CWORD_CBQUOTE 10#define CENDVAR_CENDVAR_CWORD_CENDVAR 11#define CENDFILE_CENDFILE_CENDFILE_CENDFILE 12#define CWORD_CWORD_CWORD_CWORD 13#define CCTL_CCTL_CCTL_CCTL 14static const char syntax_index_table[258] = { /* BASESYNTAX_DQSYNTAX_SQSYNTAX_ARISYNTAX */ /* 0 -130 PEOF */ CENDFILE_CENDFILE_CENDFILE_CENDFILE, /* 1 -129 PEOA */ CSPCL_CIGN_CIGN_CIGN, /* 2 -128 0xff */ CWORD_CWORD_CWORD_CWORD, /* 3 -127 */ CCTL_CCTL_CCTL_CCTL, /* CTLQUOTEMARK */ /* 4 -126 */ CCTL_CCTL_CCTL_CCTL, /* 5 -125 */ CCTL_CCTL_CCTL_CCTL, /* 6 -124 */ CCTL_CCTL_CCTL_CCTL, /* 7 -123 */ CCTL_CCTL_CCTL_CCTL, /* 8 -122 */ CCTL_CCTL_CCTL_CCTL, /* 9 -121 */ CCTL_CCTL_CCTL_CCTL, /* 10 -120 */ CCTL_CCTL_CCTL_CCTL, /* CTLESC */ /* 11 -119 */ CWORD_CWORD_CWORD_CWORD, /* 12 -118 */ CWORD_CWORD_CWORD_CWORD, /* 13 -117 */ CWORD_CWORD_CWORD_CWORD, /* 14 -116 */ CWORD_CWORD_CWORD_CWORD, /* 15 -115 */ CWORD_CWORD_CWORD_CWORD, /* 16 -114 */ CWORD_CWORD_CWORD_CWORD, /* 17 -113 */ CWORD_CWORD_CWORD_CWORD, /* 18 -112 */ CWORD_CWORD_CWORD_CWORD, /* 19 -111 */ CWORD_CWORD_CWORD_CWORD, /* 20 -110 */ CWORD_CWORD_CWORD_CWORD, /* 21 -109 */ CWORD_CWORD_CWORD_CWORD, /* 22 -108 */ CWORD_CWORD_CWORD_CWORD, /* 23 -107 */ CWORD_CWORD_CWORD_CWORD, /* 24 -106 */ CWORD_CWORD_CWORD_CWORD, /* 25 -105 */ CWORD_CWORD_CWORD_CWORD, /* 26 -104 */ CWORD_CWORD_CWORD_CWORD, /* 27 -103 */ CWORD_CWORD_CWORD_CWORD, /* 28 -102 */ CWORD_CWORD_CWORD_CWORD, /* 29 -101 */ CWORD_CWORD_CWORD_CWORD, /* 30 -100 */ CWORD_CWORD_CWORD_CWORD, /* 31 -99 */ CWORD_CWORD_CWORD_CWORD, /* 32 -98 */ CWORD_CWORD_CWORD_CWORD, /* 33 -97 */ CWORD_CWORD_CWORD_CWORD, /* 34 -96 */ CWORD_CWORD_CWORD_CWORD, /* 35 -95 */ CWORD_CWORD_CWORD_CWORD, /* 36 -94 */ CWORD_CWORD_CWORD_CWORD, /* 37 -93 */ CWORD_CWORD_CWORD_CWORD, /* 38 -92 */ CWORD_CWORD_CWORD_CWORD, /* 39 -91 */ CWORD_CWORD_CWORD_CWORD, /* 40 -90 */ CWORD_CWORD_CWORD_CWORD, /* 41 -89 */ CWORD_CWORD_CWORD_CWORD, /* 42 -88 */ CWORD_CWORD_CWORD_CWORD, /* 43 -87 */ CWORD_CWORD_CWORD_CWORD, /* 44 -86 */ CWORD_CWORD_CWORD_CWORD, /* 45 -85 */ CWORD_CWORD_CWORD_CWORD, /* 46 -84 */ CWORD_CWORD_CWORD_CWORD, /* 47 -83 */ CWORD_CWORD_CWORD_CWORD, /* 48 -82 */ CWORD_CWORD_CWORD_CWORD, /* 49 -81 */ CWORD_CWORD_CWORD_CWORD, /* 50 -80 */ CWORD_CWORD_CWORD_CWORD, /* 51 -79 */ CWORD_CWORD_CWORD_CWORD, /* 52 -78 */ CWORD_CWORD_CWORD_CWORD, /* 53 -77 */ CWORD_CWORD_CWORD_CWORD, /* 54 -76 */ CWORD_CWORD_CWORD_CWORD, /* 55 -75 */ CWORD_CWORD_CWORD_CWORD, /* 56 -74 */ CWORD_CWORD_CWORD_CWORD, /* 57 -73 */ CWORD_CWORD_CWORD_CWORD, /* 58 -72 */ CWORD_CWORD_CWORD_CWORD, /* 59 -71 */ CWORD_CWORD_CWORD_CWORD, /* 60 -70 */ CWORD_CWORD_CWORD_CWORD, /* 61 -69 */ CWORD_CWORD_CWORD_CWORD, /* 62 -68 */ CWORD_CWORD_CWORD_CWORD, /* 63 -67 */ CWORD_CWORD_CWORD_CWORD, /* 64 -66 */ CWORD_CWORD_CWORD_CWORD, /* 65 -65 */ CWORD_CWORD_CWORD_CWORD, /* 66 -64 */ CWORD_CWORD_CWORD_CWORD, /* 67 -63 */ CWORD_CWORD_CWORD_CWORD, /* 68 -62 */ CWORD_CWORD_CWORD_CWORD, /* 69 -61 */ CWORD_CWORD_CWORD_CWORD, /* 70 -60 */ CWORD_CWORD_CWORD_CWORD, /* 71 -59 */ CWORD_CWORD_CWORD_CWORD, /* 72 -58 */ CWORD_CWORD_CWORD_CWORD, /* 73 -57 */ CWORD_CWORD_CWORD_CWORD, /* 74 -56 */ CWORD_CWORD_CWORD_CWORD, /* 75 -55 */ CWORD_CWORD_CWORD_CWORD, /* 76 -54 */ CWORD_CWORD_CWORD_CWORD, /* 77 -53 */ CWORD_CWORD_CWORD_CWORD, /* 78 -52 */ CWORD_CWORD_CWORD_CWORD, /* 79 -51 */ CWORD_CWORD_CWORD_CWORD, /* 80 -50 */ CWORD_CWORD_CWORD_CWORD, /* 81 -49 */ CWORD_CWORD_CWORD_CWORD, /* 82 -48 */ CWORD_CWORD_CWORD_CWORD, /* 83 -47 */ CWORD_CWORD_CWORD_CWORD, /* 84 -46 */ CWORD_CWORD_CWORD_CWORD, /* 85 -45 */ CWORD_CWORD_CWORD_CWORD, /* 86 -44 */ CWORD_CWORD_CWORD_CWORD, /* 87 -43 */ CWORD_CWORD_CWORD_CWORD, /* 88 -42 */ CWORD_CWORD_CWORD_CWORD, /* 89 -41 */ CWORD_CWORD_CWORD_CWORD, /* 90 -40 */ CWORD_CWORD_CWORD_CWORD, /* 91 -39 */ CWORD_CWORD_CWORD_CWORD, /* 92 -38 */ CWORD_CWORD_CWORD_CWORD, /* 93 -37 */ CWORD_CWORD_CWORD_CWORD, /* 94 -36 */ CWORD_CWORD_CWORD_CWORD, /* 95 -35 */ CWORD_CWORD_CWORD_CWORD, /* 96 -34 */ CWORD_CWORD_CWORD_CWORD, /* 97 -33 */ CWORD_CWORD_CWORD_CWORD, /* 98 -32 */ CWORD_CWORD_CWORD_CWORD, /* 99 -31 */ CWORD_CWORD_CWORD_CWORD, /* 100 -30 */ CWORD_CWORD_CWORD_CWORD, /* 101 -29 */ CWORD_CWORD_CWORD_CWORD, /* 102 -28 */ CWORD_CWORD_CWORD_CWORD, /* 103 -27 */ CWORD_CWORD_CWORD_CWORD, /* 104 -26 */ CWORD_CWORD_CWORD_CWORD, /* 105 -25 */ CWORD_CWORD_CWORD_CWORD, /* 106 -24 */ CWORD_CWORD_CWORD_CWORD, /* 107 -23 */ CWORD_CWORD_CWORD_CWORD, /* 108 -22 */ CWORD_CWORD_CWORD_CWORD, /* 109 -21 */ CWORD_CWORD_CWORD_CWORD, /* 110 -20 */ CWORD_CWORD_CWORD_CWORD, /* 111 -19 */ CWORD_CWORD_CWORD_CWORD, /* 112 -18 */ CWORD_CWORD_CWORD_CWORD, /* 113 -17 */ CWORD_CWORD_CWORD_CWORD, /* 114 -16 */ CWORD_CWORD_CWORD_CWORD, /* 115 -15 */ CWORD_CWORD_CWORD_CWORD, /* 116 -14 */ CWORD_CWORD_CWORD_CWORD, /* 117 -13 */ CWORD_CWORD_CWORD_CWORD, /* 118 -12 */ CWORD_CWORD_CWORD_CWORD, /* 119 -11 */ CWORD_CWORD_CWORD_CWORD, /* 120 -10 */ CWORD_CWORD_CWORD_CWORD, /* 121 -9 */ CWORD_CWORD_CWORD_CWORD, /* 122 -8 */ CWORD_CWORD_CWORD_CWORD, /* 123 -7 */ CWORD_CWORD_CWORD_CWORD, /* 124 -6 */ CWORD_CWORD_CWORD_CWORD, /* 125 -5 */ CWORD_CWORD_CWORD_CWORD, /* 126 -4 */ CWORD_CWORD_CWORD_CWORD, /* 127 -3 */ CWORD_CWORD_CWORD_CWORD, /* 128 -2 */ CWORD_CWORD_CWORD_CWORD, /* 129 -1 */ CWORD_CWORD_CWORD_CWORD, /* 130 0 */ CWORD_CWORD_CWORD_CWORD, /* 131 1 */ CWORD_CWORD_CWORD_CWORD, /* 132 2 */ CWORD_CWORD_CWORD_CWORD, /* 133 3 */ CWORD_CWORD_CWORD_CWORD, /* 134 4 */ CWORD_CWORD_CWORD_CWORD, /* 135 5 */ CWORD_CWORD_CWORD_CWORD, /* 136 6 */ CWORD_CWORD_CWORD_CWORD, /* 137 7 */ CWORD_CWORD_CWORD_CWORD, /* 138 8 */ CWORD_CWORD_CWORD_CWORD, /* 139 9 "\t" */ CSPCL_CWORD_CWORD_CWORD, /* 140 10 "\n" */ CNL_CNL_CNL_CNL, /* 141 11 */ CWORD_CWORD_CWORD_CWORD, /* 142 12 */ CWORD_CWORD_CWORD_CWORD, /* 143 13 */ CWORD_CWORD_CWORD_CWORD, /* 144 14 */ CWORD_CWORD_CWORD_CWORD, /* 145 15 */ CWORD_CWORD_CWORD_CWORD, /* 146 16 */ CWORD_CWORD_CWORD_CWORD, /* 147 17 */ CWORD_CWORD_CWORD_CWORD, /* 148 18 */ CWORD_CWORD_CWORD_CWORD, /* 149 19 */ CWORD_CWORD_CWORD_CWORD, /* 150 20 */ CWORD_CWORD_CWORD_CWORD, /* 151 21 */ CWORD_CWORD_CWORD_CWORD, /* 152 22 */ CWORD_CWORD_CWORD_CWORD, /* 153 23 */ CWORD_CWORD_CWORD_CWORD, /* 154 24 */ CWORD_CWORD_CWORD_CWORD, /* 155 25 */ CWORD_CWORD_CWORD_CWORD, /* 156 26 */ CWORD_CWORD_CWORD_CWORD, /* 157 27 */ CWORD_CWORD_CWORD_CWORD, /* 158 28 */ CWORD_CWORD_CWORD_CWORD, /* 159 29 */ CWORD_CWORD_CWORD_CWORD, /* 160 30 */ CWORD_CWORD_CWORD_CWORD, /* 161 31 */ CWORD_CWORD_CWORD_CWORD, /* 162 32 " " */ CSPCL_CWORD_CWORD_CWORD, /* 163 33 "!" */ CWORD_CCTL_CCTL_CWORD, /* 164 34 """ */ CDQUOTE_CENDQUOTE_CWORD_CDQUOTE, /* 165 35 "#" */ CWORD_CWORD_CWORD_CWORD, /* 166 36 "$" */ CVAR_CVAR_CWORD_CVAR, /* 167 37 "%" */ CWORD_CWORD_CWORD_CWORD, /* 168 38 "&" */ CSPCL_CWORD_CWORD_CWORD, /* 169 39 "'" */ CSQUOTE_CWORD_CENDQUOTE_CSQUOTE, /* 170 40 "(" */ CSPCL_CWORD_CWORD_CLP, /* 171 41 ")" */ CSPCL_CWORD_CWORD_CRP, /* 172 42 "*" */ CWORD_CCTL_CCTL_CWORD, /* 173 43 "+" */ CWORD_CWORD_CWORD_CWORD, /* 174 44 "," */ CWORD_CWORD_CWORD_CWORD, /* 175 45 "-" */ CWORD_CCTL_CCTL_CWORD, /* 176 46 "." */ CWORD_CWORD_CWORD_CWORD, /* 177 47 "/" */ CWORD_CCTL_CCTL_CWORD, /* 178 48 "0" */ CWORD_CWORD_CWORD_CWORD, /* 179 49 "1" */ CWORD_CWORD_CWORD_CWORD, /* 180 50 "2" */ CWORD_CWORD_CWORD_CWORD, /* 181 51 "3" */ CWORD_CWORD_CWORD_CWORD, /* 182 52 "4" */ CWORD_CWORD_CWORD_CWORD, /* 183 53 "5" */ CWORD_CWORD_CWORD_CWORD, /* 184 54 "6" */ CWORD_CWORD_CWORD_CWORD, /* 185 55 "7" */ CWORD_CWORD_CWORD_CWORD, /* 186 56 "8" */ CWORD_CWORD_CWORD_CWORD, /* 187 57 "9" */ CWORD_CWORD_CWORD_CWORD, /* 188 58 ":" */ CWORD_CCTL_CCTL_CWORD, /* 189 59 ";" */ CSPCL_CWORD_CWORD_CWORD, /* 190 60 "<" */ CSPCL_CWORD_CWORD_CWORD, /* 191 61 "=" */ CWORD_CCTL_CCTL_CWORD, /* 192 62 ">" */ CSPCL_CWORD_CWORD_CWORD, /* 193 63 "?" */ CWORD_CCTL_CCTL_CWORD, /* 194 64 "@" */ CWORD_CWORD_CWORD_CWORD, /* 195 65 "A" */ CWORD_CWORD_CWORD_CWORD, /* 196 66 "B" */ CWORD_CWORD_CWORD_CWORD, /* 197 67 "C" */ CWORD_CWORD_CWORD_CWORD, /* 198 68 "D" */ CWORD_CWORD_CWORD_CWORD, /* 199 69 "E" */ CWORD_CWORD_CWORD_CWORD, /* 200 70 "F" */ CWORD_CWORD_CWORD_CWORD, /* 201 71 "G" */ CWORD_CWORD_CWORD_CWORD, /* 202 72 "H" */ CWORD_CWORD_CWORD_CWORD, /* 203 73 "I" */ CWORD_CWORD_CWORD_CWORD, /* 204 74 "J" */ CWORD_CWORD_CWORD_CWORD, /* 205 75 "K" */ CWORD_CWORD_CWORD_CWORD, /* 206 76 "L" */ CWORD_CWORD_CWORD_CWORD, /* 207 77 "M" */ CWORD_CWORD_CWORD_CWORD, /* 208 78 "N" */ CWORD_CWORD_CWORD_CWORD, /* 209 79 "O" */ CWORD_CWORD_CWORD_CWORD, /* 210 80 "P" */ CWORD_CWORD_CWORD_CWORD, /* 211 81 "Q" */ CWORD_CWORD_CWORD_CWORD, /* 212 82 "R" */ CWORD_CWORD_CWORD_CWORD, /* 213 83 "S" */ CWORD_CWORD_CWORD_CWORD, /* 214 84 "T" */ CWORD_CWORD_CWORD_CWORD, /* 215 85 "U" */ CWORD_CWORD_CWORD_CWORD, /* 216 86 "V" */ CWORD_CWORD_CWORD_CWORD, /* 217 87 "W" */ CWORD_CWORD_CWORD_CWORD, /* 218 88 "X" */ CWORD_CWORD_CWORD_CWORD, /* 219 89 "Y" */ CWORD_CWORD_CWORD_CWORD, /* 220 90 "Z" */ CWORD_CWORD_CWORD_CWORD, /* 221 91 "[" */ CWORD_CCTL_CCTL_CWORD, /* 222 92 "\" */ CBACK_CBACK_CCTL_CBACK, /* 223 93 "]" */ CWORD_CCTL_CCTL_CWORD,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -