1. Trang chủ
  2. » Công Nghệ Thông Tin

Classic Shell Scripting phần 8 doc

44 472 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 44
Dung lượng 890,99 KB

Nội dung

309 jumping, jumps, and jumpy all have the root word jump. Suffixes ble, trial, tried, and trying. Thus, the set of aller than the set of words that includes we suspect that it may pay to handle suffixes in of suffix rules. Unlike dictionary loading, here we have the possibility we keep a global count of the number of pical rule set for English in Example In many languages, words can be reduced to shorter root words by stripping suffixes. For example, in English, jumped, jumper, jumpers, jumpier, jumpiness, sometimes change the final letters of a word: try is the root of tria e words that we need to store in a dictionary is several times sm bas suffixes. Since I/O is relatively slow compared to computation, size and reduce the number of false reports in the exception list. our program, to shorten dictionary load_suffixes( ) handles the loading of supplying built-in rules, instead of reading them from a file. Thus, entries in the array that holds the suffix-rule filenames. The suffix rules bear some explanation, and to illustrate them, we show a ty 12-3. We match suffixes with regular expressions, each of which ends with $ to anchor it to the end of a word. ement suffix, as for the reduction tr+ied to tr+y. thermore, there are often several possible replacements. # Jones' -> Jones # it's -> it ble # affably -> affable "" e # breaded -> bread, flamed -> flame dly$ ed # ashamedly -> ashamed es$ "" e # arches -> arch, blues -> blue # debugged -> debug ied$ ie y # died -> die, cried -> cry l # annulled -> annul efer -> commit wed by a ce one of the possible replacements may be an empty string, we omitted if it is the only replacement. English is both highly irregular and rich in loan in expands ans, it is essential that the rules can be augmented with comment mon Unix practice with comments that run sharp ( #) to end-of-line. load_suffixes( ) therefore strips comments and leading and trailing tespace, and then discards empty lines. What remains is a regular expression and a list of zero or more e When a suffix is stripped, it may be necessary to supply a replac Fur Example 12-3. Suffix rules for English: english.sfx '$ 's$ ably$ a ed$ e gged$ g ies$ ie ies y # series -> series, ties -> tie, flies -> fly ily$ y ily # tidily -> tidy, wily -> wily ing$ # jumping -> jump ingly$ "" ing # alarmingly -> alarming or alarm lled$ ly$ "" # acutely -> acute nnily$ n # funnily -> fun pped$ p # handicapped -> handicap pping$ p # dropping -> drop rred$ r # deferred -> d t s$ # cats -> ca ed$ t # committed tt herefore a regular expression to match the suffix, follo The simplest specification of a suffix rule is t e-separated list of replacements. Sin whitespac represent it by "". It can be words from other languages, so there are many suffix rules, and certainly far more than we have listed english.sfx. However, the suffix list only reduces the incidence of false reports because it effectively the correct operation of the program. the dictionary size; it does not affect In order to make suffix-rule files maintainable by hum s to give examples of their application. We follow com from hi w replacements that are used elsewhere in calls to the awk built-in string substitution function, sub( ). Th replacement list is stored as a space-separated string to which we can later apply the split( ) built-in function. Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 310 We considered making load_suffixes( ) supply a missing $ anchor in the regular expression, but rejected that idea because it might limit the specification of suffix matching required for other languages. Suffix-rule files need to be prepared with considerable care anyway, and that job needs to be done only once for each language. pplied, we load a default set of suffixes with empty replacement values. The split( ) built-in function helps to shorten the code for this initialization: for (k = 3; k <= n; k++) nt[parts[1]] = Replacement[parts[1]] " " \ } # load default table of English suffix regexps split("'$ 's$ ed$ edly$ ly$ s$", parts) ]] = 1 } order_suffixes( ) Suffix replacement needs to be handled carefully: in particular, it should be done with a longest-match-first algorithm. order_suffixes( ) takes the list of suffix rules saved in the global Suffixes array, and copies it into the OrderedSuffix array, indexing that array by an integer that runs from one to NOrderedSuffix. ber Suffix replacements can use & to represent matched text, although we have no examples of that feature in english.sfx. In the event that no suffix files are su function load_suffixes( file, k, line, n, parts) { if (NSuffixFiles > 0) # load suffix regexps from files { for (file in SuffixFiles) { while ((getline line < file) > 0) { sub(" *#.*$", "", line) # strip comments sub("^[ \t]+", "", line) # strip leading whitespace sub("[ \t]+$", "", line) # strip trailing whitespace if (line = = "") continue n = split(line, parts) Suffixes[parts[1]]++ Replacement[parts[1]] = parts[2] Replaceme parts[k] } close(file) } else { es$ ing$ ingly$ for (k in parts) { Suffixes[parts[k Replacement[parts[k]] = "" } } 12.4.8. order_suffixes( ) then uses a simple bubble sort to reorder the entries in OrderedSuffix by decreasing pattern length, using the swap( ) function in the innermost loop. swap( ) is simple: it exchanges elements i and j of its argument array. The complexity of this sorting technique is proportional to the square of the num Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 311 required for the program setup. The second pattern/action ram calls spell_check_line( ) for each line from the input stream. b( ) does the job for us by words are then available as $1, $2, ple loop to iterate over them, handing them off to spell_check_word( ) for ence to anonymous numeric field names, like $1, in . We made an exception in this anonymous reference in the entire program. To avoid unnecessary record l_check_word( ) for further processing: functi ell_check_line( k, word) gsub(NonWordChars, " ") # eliminate nonword chars for (k = 1; k <= NF; k++) sub("^'+", "", word) # strip leading apostrophes word has been recognized. e languages, of elements to be sorted, but NOrderedSuffix is not expected to be large, so this sort is unlikely to contribute significantly to the program's runtime: function order_suffixes( i, j, key) { # Order suffixes by decreasing length NOrderedSuffix = 0 for (key in Suffixes) OrderedSuffix[++NOrderedSuffix] = key for (i = 1; i < NOrderedSuffix; i++) for (j = i + 1; j <= NOrderedSuffix; j++) if (length(OrderedSuffix[i]) < length(OrderedSuffix[j])) swap(OrderedSuffix, i, j) } nction swap(a, i, j, temp) fu { temp = a[i] i] = a[j] a[ a[j] = temp } 12.4.9. spell_check_line( ) We have now described a prog ll of the initialization code pair at the start of the The first task is to reduce the line to a list of words. The built-in function gsu ne of code. The resulting removing nonalphanumeric characters in just one li , $NF, so it just takes a sim for individual treatment. As a general awk programming convention, we avoid refer function bodies, preferring to restrict their use to short action-code blocks function: is the only such $k reassembly when it is modified, we copy it into a local variable and then strip outer apostrophes and send any nonempty result off to spel on sp { { word = $k sub("'+$", "", word) # strip trailing apostrophes if (word != "") spell_check_word(word) } } It is not particularly nice to have character-specific special handling once a ever, the apostrophe is an overloaded character that serves both to indicate contractions in som How Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 312 quoting use reduces the number of false reports in the final h uses it in the initial position in a small number of d `t for het. Those cases are trivially handled by augmenting the exception ionary. work happens, but in most cases, the job is done quickly. If the uffix ds a onary array. x stripping is not requested, or if we did not find any replacement words in the dictionary, then the word itely a spelling exception. However, it is a bad idea to write a report at this point because we usually ce a sorted list of unique spelling exceptions. The word awk, for example, occurs more than 30 n Unix tools itors. Notice that the original lettercase is as ignored during the dictionary lookup: ord, key, lc_word, location, w, lc_word = tolower(word) if (lc_word in Dictionary) # acceptable spelling ble exception eption[lc_word] "\n" location word ord ry, and the -strip option has been specified, we call over the suffix regular expressions in order of decreasing d to obtain the root word. If there are no replacement as well as provide outer quoting. Eliminating its spelling-exception list. Apostrophe stripping poses a minor problem for Dutch, whic words: ` n for een, `s for des, an dict 12.4.10. spell_check_word( ) spell_check_word() is where the real lowercase word is found in the global Dictionary array, it is spelled correctly, and we can immediately return. If the word is not in the word list, it is probably a spelling exception. However, if the user requested s stripping, then we have more work to do. strip_suffixes( ) produces a list of one or more related wor ocal wordlist array. The for loop then iterates over this list, returning if it finds stored as indices of the l rd that is in the Dictiwo If suffi efin is d want to produ times in this chapter, but is not found in any of the standard Unix spelling dictionaries. Instead, we store the a locatio word in the global Exception array, and when verbose output is requested, we prefix the word with ts of that form are common to many defined by a colon-terminated filename and line number. Repor d are readily understandable both to humans and smart text ed an preserved in the report, even though it w unction spell_check_word(w f wordlist) { return else # possi { if (Strip) { strip_suffixes(lc_word, wordlist) for (w in wordlist) if (w in Dictionary) return } location = Verbose ? (FILENAME ":" FNR ":") : "" if (lc_word in Exception) rd] = Exc Exception[lc_wo else Exception[lc_word] = location w } } 12.4.11. strip_suffixes( ) When a word has been found that is not in the dictiona strip_suffixes( ) to apply the suffix rules. It loops suffix length. If the word matches, the suffix is remove Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 313 return a match ixes lookup with suffix processing and makes it harder lacement candidates (Unix spell has the -x option to do that: for every input s a list of correctly spelled words with the same root). do-European languages, others do not need them at all, and still others elling as words change in case, number, or tense. For such languages, the rger dictionary that incorporates all of the common word forms. e is the code: nding, k, n, regexp) { ; k++) { word = substr(word, 1, RSTART - 1) if (Replacement[regexp] = = "") for (n in ending) { } t of the three pattern/action pairs. report_exceptions( ) and-line options that depend on whether the user requested a compact a verbose report with location information. In either case, we give sort the re lettercase, and the -u option to get unique output lines. A simple for loop outputs the sort -f -t: -u -k1,1 -k2n,2 -k3" : \ suffixes, the word is stored as an index of the wordlist array. Otherwise, we split the replacement list into its members and append each replacement in turn to the root word, adding it to the wordlist array. We need one special case in the inner loop, to check for the special two-character string "", which we replace with an empty string. If we have a match, the break statement leaves the loop, and the function returns to the caller. Otherwise, the loop continues with the next suffix regular expression. We could have made this function do a dictionary lookup for each candidate that we store in wordlist, and indication. We chose not to because it m to extend the program to display rep word that can take suffixes, it produce While suffix rules suffice for many In have more complex changes in sp simplest solution seems to be a la Her function strip_suffixes(word, wordlist, e split("", wordlist) r (k = 1; k <= NOrderedSuffix fo regexp = OrderedSuffix[k] rd, regexp)) if (match(wo { wordlist[word] = 1 else { split(Replacement[regexp], ending) if (ending[n] = = "\"\"") ending[n] = "" wordlist[word ending[n]] = 1 } } break } } 12.4.12. report_exceptions( ) The final job in our program is initiated by the las sets up a pipeline to sort with comm e exception words, or listing of uniqu to igno -f option exceptions to the pipeline, and the final close( ) shuts down the pipeline and completes the program. e code: Here is th function report_exceptions( key, sortpipe) { sortpipe = Verbose ? " Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 314 "sort -f -u -k1" ortpipe) mple 12-4 for (key in Exception) print Exception[key] | sortpipe close(s } a Ex collects the complete code for our spellchecker. llchecker, with user-specifiable exception ionary is constructed from a list of n be overridden on the # sage: awk [-v Dictionaries="sysdict1 sysdict2 "] -f spell.awk \ +dict2 ] \ [-strip] [-verbose] [file(s)] END { report_exceptions( ) } files, key) & ("DICTIONARIES" in ENVIRON)) Dictionaries = ENVIRON["DICTIONARIES"] Use default dictionary list usr/dict/words"]++ ["/usr/local/share/dict/words.knuth"]++ naries from command line split(Dictionaries, files) ) DictionaryFiles[files[key]]++ hars = "[^" \ FGHIJKLMNOPQRSTUVWXYZ" \ Example 12-4. Spellchecker program # Implement a simple spe # lists. The built-in dict # standard Unix spelling dictionaries, which ca # command line. # # U # # [=suffixfile1 =suffixfile2 ] [+dict1 # BEGIN { initialize( ) } { spell_check_line( ) } function get_dictionaries( { if ((Dictionaries = = "") & if (Dictionaries = = "") # { DictionaryFiles["/ DictionaryFiles } else # Use system dictio { for (key in files } } function initialize( ) { NonWordC "'" \ "ABCDE "abcdefghijklmnopqrstuvwxyz" \ Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 315 \245\246\247\250\251\252\253\254\255\256\257" \ 261\262\263\264\265\266\267\270\271\272\273\274\275\276\277" \ 300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317" \ "\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337" \ "\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357" \ \373\374\375\376\377" \ get_dictionaries( ) scan_options( ) load_dictionaries( ) load_suffixes( ) } onaries( file, word) { { > 0) Dictionary[tolower(word)]++ close(file) } function load_suffixes( file, k, line, n, parts) if (NSuffixFiles > 0) # load suffix regexps from files { getline line < file) > 0) { ip comments sub("^[ \t]+", "", line) # strip leading whitespace e) # strip trailing whitespace = "") continue n = split(line, parts) + for (k = 3; k <= n; k++) acement[parts[1]] " " \ parts[k] } close(file) } oad default table of English suffix regexps split("'$ 's$ ed$ edly$ es$ ing$ ingly$ ly$ s$", parts) "\241\242\243\244 "\260\ "\ "\360\361\362\363\364\365\366\367\370\371\372 "]" order_suffixes( ) function load_dicti for (file in DictionaryFiles) while ((getline word < file) } { { for (file in SuffixFiles) while (( sub(" *#.*$", "", line) # str sub("[ \t]+$", "", lin if (line = Suffixes[parts[1]]+ Replacement[parts[1]] = parts[2] Replacement[parts[1]] = Repl } else # l { for (k in parts) Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 316 Suffixes[parts[k]] = 1 } s by decreasing length NOrderedSuffix = 0 for (i = 1; i < NOrderedSuffix; i++) = i + 1; j <= NOrderedSuffix; j++) gth(OrderedSuffix[i]) < length(OrderedSuffix[j])) swap(OrderedSuffix, i, j) function report_exceptions( key, sortpipe) sortpipe = Verbose ? "sort -f -t: -u -k1,1 -k2n,2 -k3" : \ "sort -f -u -k1" xception) eption[key] | sortpipe close(sortpipe) { for (k = 1; k < ARGC; k++) { if (ARGV[k] = = "-strip") { ARGV[k] = "" Strip = 1 } else if (ARGV[k] = = "-verbose") { Verbose = 1 } else if (ARGV[k] ~ /^=/) # suffix file { NSuffixFiles++ SuffixFiles[substr(ARGV[k], 2)]++ { Replacement[parts[k]] = "" } } function order_suffixes( i, j, key) { # Order suffixe for (key in Suffixes) OrderedSuffix[++NOrderedSuffix] = key for (j if (len } { for (key in E print Exc } function scan_options( k) ARGV[k] = "" ARGV[k] = "" } else if (ARGV[k] ~ /^[+]/) # private dictionary { DictionaryFiles[substr(ARGV[k], 2)]++ Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 317 ARGV[k] = "" } # while ((ARGC > 0) && (ARGV[ARGC-1] = = "")) ARGC } function spell_check_line( k, word) { gsub(NonWordChars, " ") # eliminate nonword chars for (k = 1; k <= NF; k++) { word = $k sub("^'+", "", word) # strip leading apostrophes } } funct wordl { l i e { ordlist, ending, k, n, regexp) { } Remove trailing empty arguments (for nawk) sub("'+$", "", word) # strip trailing apostrophes if (word != "") spell_check_word(word) ion spell_check_word(word, key, lc_word, location, w, ist) c_word = tolower(word) f (lc_word in Dictionary) # acceptable spelling return lse # possible exception if (Strip) { strip_suffixes(lc_word, wordlist) for (w in wordlist) if (w in Dictionary) return } location = Verbose ? (FILENAME ":" FNR ":") : "" if (lc_word in Exception) Exception[lc_word] = Exception[lc_word] "\n" location word else Exception[lc_word] = location word } } function strip_suffixes(word, w split("", wordlist) for (k = 1; k <= NOrderedSuffix; k++) { regexp = OrderedSuffix[k] Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 318 ending[n]] = 1 12.4.13. Retrospective on Our Spellchecker if (match(word, regexp)) { word = substr(word, 1, RSTART - 1) if (Replacement[regexp] = = "") wordlist[word] = 1 else { split(Replacement[regexp], ending) for (n in ending) { if (ending[n] = = "\"\"") ending[n] = "" wordlist[word } } break } } } function swap(a, i, j, temp) { temp = a[i] a[i] = a[j] a[j] = temp } The first version of a Unix spellchecker was the pipeline that we presented at the beginning of the chapter. The first Unix spelling program in C that we could find in The Unix Heritage Society archives [7] is the 1975 Ver 6 Unix typo command; it is about 350 lines of C code. spell first appeared in the 1979 Version 7 Unix r sion elease, nd took about 700 lines of C code. It was accompanied by a 940-word common English dictionary, supplemented by another 320 words each of American and British spelling variations. spell was omitted from e code release, presumably because of trade secret or copyright issues. [7] See http://www.tuhs.org/ a the 1995 4.4 BSD-Lite sourc . r so American and s for In about 190 lines of code, made up of three pattern/action one-liners and 11 functions, it does most of what traditional Unix spell does, and more: The modern OpenBSD spell is about 1100 lines of C code, with about 30 more words in each of its three basic dictionaries. GNU ispell version 3.2 is about 13,500 lines of C code, and GNU aspell version 0.60 is about 29,500 lines of C++ and C code. Both have been internationalized, with dictionaries for 10 to 40 languages. ispell has significantly enlarged English dictionaries, with about 80,000 common words, plus 3750 o British variations. The aspell dictionaries are even bigger: 142,000 English words plus about 4200 variation each of American, British, and Canadian. Our spellchecker, spell.awk, is a truly remarkable program, and you will appreciate it even more and understand awk even better if you reimplement the program in another programming language. Like Johnson's original 1975 spell command, its design and implementation took less than an afternoon. Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com [...]... verbosely devel devel devel devel devel devel devel devel devel devel devel devel 0 0 0 0 0 0 0 0 0 0 0 0 Oct Oct Oct Oct Oct Oct Oct Oct Oct Oct Oct Oct 28 28 28 28 28 28 28 28 28 28 28 28 11: 38 11: 38 11: 38 11: 38 11: 38 11: 38 11: 38 11: 38 11: 38 11: 38 11: 38 11: 38 cmdline cwd -> /home/jones environ exe -> /usr/bin/vi fd maps mem mounts root -> / stat statm status Notice that the files all appear to be empty,... COMMAND START END REAL CPU MEAN NAME USER TTYNAME TIME TIME (SECS) (SECS) SIZE(K) cat jones ? 21:33: 38 21:33: 38 0.07 0.04 1046.00 0.13 0.04 88 4.00 echo jones ? 21:33: 38 21:33: 38 ? 21:33: 38 21:33: 38 make jones 0.53 0.05 10 48. 00 grep jones ? 21:33: 38 21:33: 38 0.14 0.03 84 0.00 bash jones ? 21:33: 38 21:33: 38 0.55 0.02 1592.00 Because the output format and the accounting tools differ between Unix implementations,... List the trace log 86 98 Jul 27 09:44 ktrace.out Post-process the trace log $ kdump 3 38 197 98 ktrace Simpo PDF Merge EMUL "netbsd" and Split Unregistered Version - http://www.simpopdf.com 197 98 ktrace CALL execve(0xbfbfc650,0xbfbfcb24,0xbfbfcb34) 197 98 ktrace NAMI "/usr/local/bin/test" 197 98 test CALL access(0xbfbfcc80,0x1) 197 98 test NAMI "/bin/sh" 197 98 test RET access 0 197 98 test CALL exit(0)... different shells on a Sun Solaris system: $ /bin/sh debug-trap Try the Bourne shell test-debug-trap: trap: bad trap /tmp /tmp This is an EXIT trap $ /bin/ksh debug-trap /tmp This is a DEBUG trap /tmp This is a DEBUG trap This is an EXIT trap Try the 1 988 (i) Korn shell 333 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com $ /usr/xpg4/bin/sh debug-trap Try the POSIX shell (1 988 (i)... COMMAND 25 18 jonesMerge and Split Unregistered Version - run 1 0 0 506M 505M http://www.simpopdf.com 44:43 33.95% Simpo PDF 1111 owens 1 0 19 21M 21M run 87 :19 24.04% 2 381 3 smith 1 0 19 184 M 184 M cpu/0 7 68: 57 20.39% 25 389 brown 1 1 19 30M 23M run 184 :22 1.07% Macaulay2 ocDom mserver netscape By default, top shows the most CPU-intensive processes at the top of the list, which is usually what you are... server: Show top resource consumers $ top load averages: 5. 28, 4.74, 4.59 15:42:00 322 processes: 295 sleeping, 4 running, 12 zombie, 9 stopped, 2 on cpu CPU states: 0.0% idle, 95.9% user, 4.1% kernel, 0.0% iowait, 0.0% swap Memory: 2048M real, 88 M free, 1916M swap in use, 80 90M swap free PID USERNAME THR PRI NICE SIZE RES STATE 324 TIME CPU COMMAND 25 18 jonesMerge and Split Unregistered Version - run 1 0... ? 9:53 /etc/init 8 S root 1 0 0 41 20 0 0 0 SY ? 0 ? Dec 27 ? 0: 18 pageout 19 S root 2 19 S root 3 0 0 0 SY ? 0 ? Dec 27 ? 285 2:26 fsflush 323 whereas inPDF Merge and Split Unregistered Version - http://www.simpopdf.com Simpo the BSD style, we use: BSD style $ ps aux PID %CPU %MEM SZ RSS TT S START TIME COMMAND USER root 3 0.4 0.0 0 0 ? S Dec 27 285 2: 28 fsflush 0:00 ps aux smith 13 680 0.1 0.2 1664... process until a less-busy time, like this: $ top Show top resource consumers TIME CPU COMMAND PID USERNAME THR PRI NICE SIZE RES STATE 9 58 0 125M 118M cpu/3 109:49 93.67% cruncher 17 787 johnson $ kill -STOP 17 787 Suspend process $ sleep 36000 && kill -CONT 17 787 & Resume process in 10 hours 13.3.1 Deleting Processes For deleting processes, it is important to know about only four signals: ABRT (abort),... output Finally, exit from the shell, and the trace: traced-sh$ exit shell exit This is trace output _exit(0) = ? This is trace output Exit from the We are now back in the original shell session: 336 $ Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com shell; check pwd Back in original where we are /home/jones/book Working directory is unchanged The shell made a fork( ) system call... and their usage counts like this: # acctcom -a | cut -d ' ' -f 1 | sort | uniq -c | sort -k1nr -k2 | head -n 10 21129 bash 55 38 cat 4669 rm 35 38 sed 1713 acomp 13 78 cc 1252 cg 339 1252 iropt Merge and Split Unregistered Version - http://www.simpopdf.com Simpo PDF 1172 uname 80 8 gawk Here, we used cut to extract the first field, then ordered that list with sort, reduced it to counts of duplicates with . Memory: 2048M real, 88 M free, 191 Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com 325 6M 505M run 44:43 33.95% Macaulay2 87 :19 24.04% ocDom 184 M cpu/0 7 68: 57 20.39%. RSS TT S START TIME COMMAND root 3 0.4 0.0 0 0 ? S Dec 27 285 2: 28 fsflush 0.1 0.2 1664 1320 pts/25 O 15:03:45 0:00 ps aux nes 252 68 0.1 2.02093619376 pts/24 S Mar 22 29:56 emacs -bg ivory pr. lower 1 28 slots. Although IBM mainframe EBCDIC is not supported, European 8- bit character sets pose no problem, and even the two-million-character Unicode set in the multibyte UTF -8 encoding

Ngày đăng: 12/08/2014, 10:22

TỪ KHÓA LIÊN QUAN