]> git.ipfire.org Git - thirdparty/bash.git/commitdiff
commit bash-20110909 snapshot
authorChet Ramey <chet.ramey@case.edu>
Mon, 9 Jan 2012 13:27:36 +0000 (08:27 -0500)
committerChet Ramey <chet.ramey@case.edu>
Mon, 9 Jan 2012 13:27:36 +0000 (08:27 -0500)
14 files changed:
CWRU/CWRU.chlog
CWRU/CWRU.chlog~
bashline.c
bashline.c~
bracecomp.c
builtins/printf.def
builtins/shopt.def
doc/bash.1
doc/bashref.texi
doc/version.texi
externs.h
lib/sh/shquote.c
po/zh_CN.po
tests/errors.right

index 9da74b2055c262420a58dd8f2146948aa159df02..e627c32e0581663ef8828a099f7f7c4895bff8c4 100644 (file)
@@ -12136,3 +12136,46 @@ lib/sh/strtrans.c
          code converts them to wide characters and uses iswprint to check
          valid wide chars.  From a patch sent by Roman Rakus
          <rrakus@redhat.com>
+
+                                   9/7
+                                   ---
+lib/sh/shquote.c
+       - sh_backslash_quote: change to be table-driven so we can use a
+         different table if we want to
+       - sh_backslash_quote: takes a second char table[256] argument;
+
+externs.h
+       - sh_backslash_quote: add second argument to function prototype
+
+bashline.c,braces.c,parse.y,builtins/printf.def
+       - change callers of sh_backslash_quote to add second argument
+
+bashline.c
+       - filename_bstab: table of characters to pass to sh_backslash_quote;
+         characters with value 1 will be backslash-quoted
+       - set_filename_bstab: turn on characters in filename backslash-quote
+         table according to passed string argument
+       - call set_filename_bstab every time rl_filename_quote_characters is
+         assigned a value
+       - bash_quote_filename: call sh_backslash_quote with filename_bstab
+         as second argument.  This allows other characters in filenames to
+         be quoted without quoting, for instance, a dollar sign in a shell
+         variable reference
+
+                                   9/8
+                                   ---
+bashline.c
+       - complete_fullquote: new variable, controls table passed to
+         sh_backslash_quote.  If non-zero (the default), the standard set
+         of shell metacharacters -- as in bash versions up to and including
+         bash-4.2 -- gets backslash-quoted by the completion code.  If zero,
+         sh_backslash_quote gets the table with the characters in the
+         variable reference removed, which means they are removed from the
+         set of characters to be quoted in filenames
+
+                                  9/10
+                                  ----
+bashline.c
+       - bash_filename_stat_hook: new function, designed to expand variable
+         references in filenames before readline passes them to stat(2)
+         to determine whether or not they are a directory
index 7fc45b7ec940cddba013a58b644a2ae9752a383b..007fdb2d456bf1922369265d9e5ce9db6a2db61d 100644 (file)
@@ -12121,3 +12121,54 @@ support/shobj-conf
        - handle compilation on Lion (Mac OS X 10.7/darwin11) with changes
          to darwin stanzas.  Fixes readline bug reported by Vincent
          Sheffer <vince.sheffer@apisphere.com>
+
+lib/sh/strtrans.c
+       - ansic_wshouldquote: check a string with multi-byte characters for
+         characters that needs to be backslash-octal escaped for $'...'
+       - ansic_shouldquote: if is_basic fails for one character, let
+         ansic_wshouldquote examine the rest of the string and return what
+         it returns.  From a patch sent by Roman Rakus <rrakus@redhat.com>
+
+                                  8/30
+                                  ----
+lib/sh/strtrans.c
+       - ansic_quote: changes to quote (or not) multibyte characters.  New
+         code converts them to wide characters and uses iswprint to check
+         valid wide chars.  From a patch sent by Roman Rakus
+         <rrakus@redhat.com>
+
+                                   9/7
+                                   ---
+lib/sh/shquote.c
+       - sh_backslash_quote: change to be table-driven so we can use a
+         different table if we want to
+       - sh_backslash_quote: takes a second char table[256] argument;
+
+externs.h
+       - sh_backslash_quote: add second argument to function prototype
+
+bashline.c,braces.c,parse.y,builtins/printf.def
+       - change callers of sh_backslash_quote to add second argument
+
+bashline.c
+       - filename_bstab: table of characters to pass to sh_backslash_quote;
+         characters with value 1 will be backslash-quoted
+       - set_filename_bstab: turn on characters in filename backslash-quote
+         table according to passed string argument
+       - call set_filename_bstab every time rl_filename_quote_characters is
+         assigned a value
+       - bash_quote_filename: call sh_backslash_quote with filename_bstab
+         as second argument.  This allows other characters in filenames to
+         be quoted without quoting, for instance, a dollar sign in a shell
+         variable reference
+
+                                   9/8
+                                   ---
+bashline.c
+       - complete_fullquote: new variable, controls table passed to
+         sh_backslash_quote.  If non-zero (the default), the standard set
+         of shell metacharacters -- as in bash versions up to and including
+         bash-4.2 -- gets backslash-quoted by the completion code.  If zero,
+         sh_backslash_quote gets the table with the characters in the
+         variable reference removed, which means they are removed from the
+         set of characters to be quoted in filenames
index 372c59ac01d2b549403d6d5da875e715a54e71e2..ca1c9ffbf3bee0fdf4cae95ad2d72918050bbb90 100644 (file)
@@ -116,13 +116,15 @@ static int bash_backward_kill_shellword __P((int, int));
 static char *restore_tilde __P((char *, char *));
 
 static char *bash_filename_rewrite_hook __P((char *, int));
+
 static void bash_directory_expansion __P((char **));
+static int bash_filename_stat_hook __P((char **));
 static int bash_directory_completion_hook __P((char **));
 static int filename_completion_ignore __P((char **));
 static int bash_push_line __P((void));
 
 static rl_icppfunc_t *save_directory_hook __P((void));
-static void reset_directory_hook __P((rl_icppfunc_t *));
+static void restore_directory_hook __P((rl_icppfunc_t));
 
 static void cleanup_expansion_error __P((void));
 static void maybe_make_readline_line __P((char *));
@@ -151,6 +153,7 @@ static int return_zero __P((const char *));
 
 static char *bash_dequote_filename __P((char *, int));
 static char *quote_word_break_chars __P((char *));
+static void set_filename_bstab __P((const char *));
 static char *bash_quote_filename __P((char *, int, char *));
 
 static int putx __P((int));
@@ -251,12 +254,20 @@ int dircomplete_spelling = 0;
 /* Expand directory names during word/filename completion. */
 int dircomplete_expand = 0;
 
+/* When non-zero, perform `normal' shell quoting on completed filenames
+   even when the completed name contains a directory name with a shell
+   variable referene, so dollar signs in a filename get quoted appropriately.
+   Set to zero to remove dollar sign (and braces or parens as needed) from
+   the set of characters that will be quoted. */
+int complete_fullquote = 1;
+
 static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
 static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
 /* )) */
 
 static const char *default_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~";        /*}*/
 static char *custom_filename_quote_characters = 0;
+static char filename_bstab[256];
 
 static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;
 
@@ -541,6 +552,7 @@ initialize_readline ()
 
   /* characters that need to be quoted when appearing in filenames. */
   rl_filename_quote_characters = default_filename_quote_characters;
+  set_filename_bstab (rl_filename_quote_characters);
 
   rl_filename_quoting_function = bash_quote_filename;
   rl_filename_dequoting_function = bash_dequote_filename;
@@ -589,6 +601,7 @@ bashline_reset ()
   rl_completion_entry_function = NULL;
   rl_ignore_some_completions_function = filename_completion_ignore;
   rl_filename_quote_characters = default_filename_quote_characters;
+  set_filename_bstab (rl_filename_quote_characters);
 
   set_directory_hook ();
 }
@@ -1311,6 +1324,7 @@ attempt_shell_completion (text, start, end)
   rl_ignore_some_completions_function = filename_completion_ignore;
 
   rl_filename_quote_characters = default_filename_quote_characters;
+  set_filename_bstab (rl_filename_quote_characters);
 
   /* Determine if this could be a command word.  It is if it appears at
      the start of the line (ignoring preceding whitespace), or if it
@@ -2799,6 +2813,56 @@ restore_directory_hook (hookf)
     rl_directory_rewrite_hook = hookf;
 }
 
+static int
+bash_filename_stat_hook (dirname)
+     char **dirname;
+{
+  char *local_dirname, *new_dirname, *t;
+  int should_expand_dirname, return_value;
+  WORD_LIST *wl;
+  struct stat sb;
+
+  local_dirname = *dirname;
+  should_expand_dirname = return_value = 0;
+  if (t = mbschr (local_dirname, '$'))
+    should_expand_dirname = '$';
+  else if (t = mbschr (local_dirname, '`'))    /* XXX */
+    should_expand_dirname = '`';
+
+#if defined (HAVE_LSTAT)
+  if (should_expand_dirname && lstat (local_dirname, &sb) == 0)
+#else
+  if (should_expand_dirname && stat (local_dirname, &sb) == 0)
+#endif
+    should_expand_dirname = 0;
+  
+  if (should_expand_dirname)  
+    {
+      new_dirname = savestring (local_dirname);
+      wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB);  /* does the right thing */
+      if (wl)
+       {
+         free (new_dirname);
+         new_dirname = string_list (wl);
+         /* Tell the completer we actually expanded something and change
+            *dirname only if we expanded to something non-null -- stat
+            behaves unpredictably when passed null or empty strings */
+         if (new_dirname && *new_dirname)
+           {
+             *dirname = new_dirname;
+             return_value = STREQ (local_dirname, *dirname) == 0;
+           }
+         free (local_dirname);
+         free (new_dirname);
+         dispose_words (wl);
+       }
+      else
+       free (new_dirname);
+    }  
+
+  return (return_value);
+}
+
 /* Handle symbolic link references and other directory name
    expansions while hacking completion.  This should return 1 if it modifies
    the DIRNAME argument, 0 otherwise.  It should make sure not to modify
@@ -2872,6 +2936,7 @@ bash_directory_completion_hook (dirname)
                }
              custom_filename_quote_characters[j] = '\0';
              rl_filename_quote_characters = custom_filename_quote_characters;
+             set_filename_bstab (rl_filename_quote_characters);
            }
        }
       else
@@ -3494,6 +3559,20 @@ quote_word_break_chars (text)
   return ret;
 }
 
+/* Use characters in STRING to populate the table of characters that should
+   be backslash-quoted.  The table will be used for sh_backslash_quote from
+   this file. */
+static void
+set_filename_bstab (string)
+     const char *string;
+{
+  const char *s;
+
+  memset (filename_bstab, 0, sizeof (filename_bstab));
+  for (s = string; s && *s; s++)
+    filename_bstab[*s] = 1;
+}
+
 /* Quote a filename using double quotes, single quotes, or backslashes
    depending on the value of completion_quoting_style.  If we're
    completing using backslashes, we need to quote some additional
@@ -3559,7 +3638,7 @@ bash_quote_filename (s, rtype, qcp)
       rtext = sh_single_quote (mtext);
       break;
     case COMPLETE_BSQUOTE:
-      rtext = sh_backslash_quote (mtext);
+      rtext = sh_backslash_quote (mtext, complete_fullquote ? 0 : filename_bstab);
       break;
     }
 
index df48fdbeb84a87ff08d3f099602b45ce954163d7..4ea319ae1492a91d09fc6886b722c5bb17b4f4b2 100644 (file)
@@ -121,7 +121,6 @@ static int bash_directory_completion_hook __P((char **));
 static int filename_completion_ignore __P((char **));
 static int bash_push_line __P((void));
 
-static void set_directory_hook __P((void));
 static rl_icppfunc_t *save_directory_hook __P((void));
 static void reset_directory_hook __P((rl_icppfunc_t *));
 
@@ -152,6 +151,7 @@ static int return_zero __P((const char *));
 
 static char *bash_dequote_filename __P((char *, int));
 static char *quote_word_break_chars __P((char *));
+static void set_filename_bstab __P((const char *));
 static char *bash_quote_filename __P((char *, int, char *));
 
 static int putx __P((int));
@@ -250,7 +250,14 @@ int force_fignore = 1;
 int dircomplete_spelling = 0;
 
 /* Expand directory names during word/filename completion. */
-int dircomplete_expand = 1;
+int dircomplete_expand = 0;
+
+/* When non-zero, perform `normal' shell quoting on completed filenames
+   even when the completed name contains a directory name with a shell
+   variable referene, so dollar signs in a filename get quoted appropriately.
+   Set to zero to remove dollar sign (and braces or parens as needed) from
+   the set of characters that will be quoted. */
+int complete_fullquote = 1;
 
 static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
 static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
@@ -258,6 +265,7 @@ static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
 
 static const char *default_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~";        /*}*/
 static char *custom_filename_quote_characters = 0;
+static char filename_bstab[256];
 
 static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;
 
@@ -542,6 +550,7 @@ initialize_readline ()
 
   /* characters that need to be quoted when appearing in filenames. */
   rl_filename_quote_characters = default_filename_quote_characters;
+  set_filename_bstab (rl_filename_quote_characters);
 
   rl_filename_quoting_function = bash_quote_filename;
   rl_filename_dequoting_function = bash_dequote_filename;
@@ -590,6 +599,7 @@ bashline_reset ()
   rl_completion_entry_function = NULL;
   rl_ignore_some_completions_function = filename_completion_ignore;
   rl_filename_quote_characters = default_filename_quote_characters;
+  set_filename_bstab (rl_filename_quote_characters);
 
   set_directory_hook ();
 }
@@ -1312,6 +1322,7 @@ attempt_shell_completion (text, start, end)
   rl_ignore_some_completions_function = filename_completion_ignore;
 
   rl_filename_quote_characters = default_filename_quote_characters;
+  set_filename_bstab (rl_filename_quote_characters);
 
   /* Determine if this could be a command word.  It is if it appears at
      the start of the line (ignoring preceding whitespace), or if it
@@ -2755,13 +2766,20 @@ bash_filename_rewrite_hook (fname, fnlen)
 }
 
 /* Functions to save and restore the appropriate directory hook */
-static void
+/* This is not static so the shopt code can call it */
+void
 set_directory_hook ()
 {
   if (dircomplete_expand)
-    rl_directory_completion_hook = bash_directory_completion_hook;
+    {
+      rl_directory_completion_hook = bash_directory_completion_hook;
+      rl_directory_rewrite_hook = (rl_icppfunc_t *)0;
+    }
   else
-    rl_directory_rewrite_hook = bash_directory_completion_hook;
+    {
+      rl_directory_rewrite_hook = bash_directory_completion_hook;
+      rl_directory_completion_hook = (rl_icppfunc_t *)0;
+    }
 }
 
 static rl_icppfunc_t *
@@ -2793,6 +2811,56 @@ restore_directory_hook (hookf)
     rl_directory_rewrite_hook = hookf;
 }
 
+static int
+bash_directory_stat_hook (dirname)
+     char **dirname;
+{
+  char *local_dirname, *new_dirname, *t;
+  int should_expand_dirname, return_value;
+  WORD_LIST *wl;
+  struct stat sb;
+
+  local_dirname = *dirname;
+  should_expand_dirname = return_value = 0;
+  if (t = mbschr (local_dirname, '$'))
+    should_expand_dirname = '$';
+  else if (t = mbschr (local_dirname, '`'))    /* XXX */
+    should_expand_dirname = '`';
+
+#if defined (HAVE_LSTAT)
+  if (should_expand_dirname && lstat (local_dirname, &sb) == 0)
+#else
+  if (should_expand_dirname && stat (local_dirname, &sb) == 0)
+#endif
+    should_expand_dirname = 0;
+  
+  if (should_expand_dirname)  
+    {
+      new_dirname = savestring (local_dirname);
+      wl = expand_prompt_string (new_dirname, 0, W_NOCOMSUB);  /* does the right thing */
+      if (wl)
+       {
+         free (new_dirname);
+         new_dirname = string_list (wl);
+         /* Tell the completer we actually expanded something and change
+            *dirname only if we expanded to something non-null -- stat
+            behaves unpredictably when passed null or empty strings */
+         if (new_dirname && *new_dirname)
+           {
+             *dirname = new_dirname;
+             return_value = STREQ (local_dirname, *dirname) == 0;
+           }
+         free (local_dirname);
+         free (new_dirname);
+         dispose_words (wl);
+       }
+      else
+       free (new_dirname);
+    }  
+
+  return (return_value);
+}
+
 /* Handle symbolic link references and other directory name
    expansions while hacking completion.  This should return 1 if it modifies
    the DIRNAME argument, 0 otherwise.  It should make sure not to modify
@@ -2866,6 +2934,7 @@ bash_directory_completion_hook (dirname)
                }
              custom_filename_quote_characters[j] = '\0';
              rl_filename_quote_characters = custom_filename_quote_characters;
+             set_filename_bstab (rl_filename_quote_characters);
            }
        }
       else
@@ -3488,6 +3557,20 @@ quote_word_break_chars (text)
   return ret;
 }
 
+/* Use characters in STRING to populate the table of characters that should
+   be backslash-quoted.  The table will be used for sh_backslash_quote from
+   this file. */
+static void
+set_filename_bstab (string)
+     const char *string;
+{
+  const char *s;
+
+  memset (filename_bstab, 0, sizeof (filename_bstab));
+  for (s = string; s && *s; s++)
+    filename_bstab[*s] = 1;
+}
+
 /* Quote a filename using double quotes, single quotes, or backslashes
    depending on the value of completion_quoting_style.  If we're
    completing using backslashes, we need to quote some additional
@@ -3553,7 +3636,7 @@ bash_quote_filename (s, rtype, qcp)
       rtext = sh_single_quote (mtext);
       break;
     case COMPLETE_BSQUOTE:
-      rtext = sh_backslash_quote (mtext);
+      rtext = sh_backslash_quote (mtext, complete_fullquote ? 0 : filename_bstab);
       break;
     }
 
index cb218a2bf42d25c8799ea0e82754a2d0c317c3dc..8698e441b56b66ffe1582aefaea99ed115d07859 100644 (file)
@@ -75,8 +75,8 @@ really_munge_braces (array, real_start, real_end, gcd_zero)
 
   if (real_start == real_end)
     {
-      x = array[real_start] ? sh_backslash_quote (array[real_start] + gcd_zero)
-                           : sh_backslash_quote (array[0]);
+      x = array[real_start] ? sh_backslash_quote (array[real_start] + gcd_zero, 0)
+                           : sh_backslash_quote (array[0], 0);
       return x;
     }
 
@@ -115,7 +115,7 @@ really_munge_braces (array, real_start, real_end, gcd_zero)
       if (start == end)
        {
          x = savestring (array[start] + gcd_zero);
-         subterm = sh_backslash_quote (x);
+         subterm = sh_backslash_quote (x, 0);
          free (x);
        }
       else
@@ -126,7 +126,7 @@ really_munge_braces (array, real_start, real_end, gcd_zero)
          x = (char *)xmalloc (tlen + 1);
          strncpy (x, array[start] + gcd_zero, tlen);
          x[tlen] = '\0';
-         subterm = sh_backslash_quote (x);
+         subterm = sh_backslash_quote (x, 0);
          free (x);
          result_size += strlen (subterm) + 1;
          result = (char *)xrealloc (result, result_size);
index 04f4ebc6a718f06c93681f32f7ab3349edd4e130..58889013dd489448cd78b29119d55fb9bfe24c73 100644 (file)
@@ -553,7 +553,7 @@ printf_builtin (list)
                else if (ansic_shouldquote (p))
                  xp = ansic_quote (p, 0, (int *)0);
                else
-                 xp = sh_backslash_quote (p);
+                 xp = sh_backslash_quote (p, 0);
                if (xp)
                  {
                    /* Use printstr to get fieldwidth and precision right. */
index 1fa58c822cb28400bcaa8eea834269253c690d0d..95294f0325c14541bd0241aadd253302e0433c87 100644 (file)
@@ -100,6 +100,7 @@ extern int hist_verify, history_reediting, perform_hostname_completion;
 extern int no_empty_command_completion;
 extern int force_fignore;
 extern int dircomplete_spelling, dircomplete_expand;
+extern int complete_fullquote;
 
 extern int enable_hostname_completion __P((int));
 #endif
@@ -159,6 +160,7 @@ static struct {
   { "compat40", &shopt_compat40, set_compatibility_level },
   { "compat41", &shopt_compat41, set_compatibility_level },
 #if defined (READLINE)
+  { "complete_fullquote", &complete_fullquote, (shopt_set_func_t *)NULL},
   { "direxpand", &dircomplete_expand, shopt_set_complete_direxpand },
   { "dirspell", &dircomplete_spelling, (shopt_set_func_t *)NULL },
 #endif
index 01bf16e3f218b600533462232b5aa4350349a0d1..57f5a5ac6ba098dc2331d0780b9ce0ecde584329 100644 (file)
@@ -5,12 +5,12 @@
 .\"    Case Western Reserve University
 .\"    chet@po.cwru.edu
 .\"
-.\"    Last Change: Fri Sep  2 14:19:38 EDT 2011
+.\"    Last Change: Thu Sep  8 09:39:24 EDT 2011
 .\"
 .\" bash_builtins, strip all but Built-Ins section
 .if \n(zZ=1 .ig zZ
 .if \n(zY=1 .ig zY
-.TH BASH 1 "2011 September 2" "GNU Bash 4.2"
+.TH BASH 1 "2011 September 8" "GNU Bash 4.2"
 .\"
 .\" There's some problem with having a `@'
 .\" in a tagged paragraph with the BSD man macros.
@@ -8993,6 +8993,25 @@ parameter expansion as a special character.  The single quotes must match
 quoted.  This is the behavior of posix mode through version 4.1.
 The default bash behavior remains as in previous versions.
 .TP 8
+.B complete_fullquote
+If set,
+.B bash
+quotes all shell metacharacters in filenames and directory names when
+performing completion.
+If not set,
+.B bash
+removes metacharacters such as the dollar sign from the set of
+characters that will be quoted in completed filenames
+when these metacharacters appear in shell variable references in words to be
+completed.
+This means that dollar signs in variable names that expand to directories
+will not be quoted;
+however, any dollar signs appearing in filenames will not be quoted, either.
+This is active only when bash is using backslashes to quote completed
+filenames.
+This variable is set by default, which is the default bash behavior in
+versions through 4.2.
+.TP 8
 .B direxpand
 If set,
 .B bash
index 532cd3d496834d61d6639ec8443db7ad0764dbd7..814623bf5f663295fdc615ecb8e77de11a69832c 100644 (file)
@@ -4562,6 +4562,23 @@ parameter expansion as a special character.  The single quotes must match
 quoted.  This is the behavior of @sc{posix} mode through version 4.1.
 The default Bash behavior remains as in previous versions.
 
+@item complete_fullquote
+If set, Bash
+quotes all shell metacharacters in filenames and directory names when
+performing completion.
+If not set, Bash
+removes metacharacters such as the dollar sign from the set of
+characters that will be quoted in completed filenames
+when these metacharacters appear in shell variable references in words to be
+completed.
+This means that dollar signs in variable names that expand to directories
+will not be quoted;
+however, any dollar signs appearing in filenames will not be quoted, either.
+This is active only when bash is using backslashes to quote completed
+filenames.
+This variable is set by default, which is the default Bash behavior in
+versions through 4.2.
+
 @item direxpand
 If set, Bash
 replaces directory names with the results of word expansion when performing
index 38eb8a19bd8d5cf6653e803a188ebff2e7700f03..55c1c660cba66d7d38987862c0503a660c3c7bc4 100644 (file)
@@ -2,9 +2,9 @@
 Copyright (C) 1988-2011 Free Software Foundation, Inc.
 @end ignore
 
-@set LASTCHANGE Fri Sep  2 14:19:16 EDT 2011
+@set LASTCHANGE Thu Sep  8 09:39:10 EDT 2011
 
 @set EDITION 4.2
 @set VERSION 4.2
-@set UPDATED 2 September 2011
+@set UPDATED 8 September 2011
 @set UPDATED-MONTH September 2011
index 09244fa443aa1091380b3a2ec6362a3d8bc9be7a..2d7e83d3b3a716811ee72800315e1bb59d16c0b6 100644 (file)
--- a/externs.h
+++ b/externs.h
@@ -312,7 +312,7 @@ extern char *sh_single_quote __P((const char *));
 extern char *sh_double_quote __P((const char *));
 extern char *sh_mkdoublequoted __P((const char *, int, int));
 extern char *sh_un_double_quote __P((char *));
-extern char *sh_backslash_quote __P((char *));
+extern char *sh_backslash_quote __P((char *, const char *));
 extern char *sh_backslash_quote_for_double_quotes __P((char *));
 extern int sh_contains_shell_metas __P((char *));
 
index a1e9146bfa8171ae43bf62b44fc3a12f03c098b5..602ce9b98792636bc48a843f29da22a1ba7a10ad 100644 (file)
 #include "syntax.h"
 #include <xmalloc.h>
 
+/* Default set of characters that should be backslash-quoted in strings */
+static const char bstab[256] =
+  {
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 1, 1, 0, 0, 0, 0, 0,    /* TAB, NL */
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+
+    1, 1, 1, 0, 1, 0, 1, 1,    /* SPACE, !, DQUOTE, DOL, AMP, SQUOTE */
+    1, 1, 1, 0, 1, 0, 0, 0,    /* LPAR, RPAR, STAR, COMMA */
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 0, 1, 1,    /* SEMI, LESSTHAN, GREATERTHAN, QUEST */
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 1, 0,    /* LBRACK, BS, RBRACK, CARAT */
+
+    1, 0, 0, 0, 0, 0, 0, 0,    /* BACKQ */
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 1, 1, 1, 0, 0,    /* LBRACE, BAR, RBRACE */
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+  };
+
 /* **************************************************************** */
 /*                                                                 */
 /*      Functions for quoting strings to be re-read as input       */
@@ -165,51 +209,24 @@ sh_un_double_quote (string)
    going through the shell parser, which will protect the internal
    quoting characters. */
 char *
-sh_backslash_quote (string)
+sh_backslash_quote (string, table)
      char *string;
+     char *table;
 {
   int c;
-  char *result, *r, *s;
+  char *result, *r, *s, *backslash_table;
 
   result = (char *)xmalloc (2 * strlen (string) + 1);
 
+  backslash_table = table ? table : bstab;
   for (r = result, s = string; s && (c = *s); s++)
     {
-      switch (c)
-       {
-       case ' ': case '\t': case '\n':         /* IFS white space */
-       case '\'': case '"': case '\\':         /* quoting chars */
-       case '|': case '&': case ';':           /* shell metacharacters */
-       case '(': case ')': case '<': case '>':
-       case '!': case '{': case '}':           /* reserved words */
-       case '*': case '[': case '?': case ']': /* globbing chars */
-       case '^':
-       case '$': case '`':                     /* expansion chars */
-       case ',':                               /* brace expansion */
-         *r++ = '\\';
-         *r++ = c;
-         break;
-#if 0
-       case '~':                               /* tilde expansion */
-         if (s == string || s[-1] == '=' || s[-1] == ':')
-           *r++ = '\\';
-         *r++ = c;
-         break;
-
-       case CTLESC: case CTLNUL:               /* internal quoting characters */
-         *r++ = CTLESC;                        /* could be '\\'? */
-         *r++ = c;
-         break;
-#endif
-
-       case '#':                               /* comment char */
-         if (s == string)
-           *r++ = '\\';
-         /* FALLTHROUGH */
-       default:
-         *r++ = c;
-         break;
-       }
+      
+      if (backslash_table[c] == 1)
+       *r++ = '\\';
+      else if (c == '#' && s == string)                        /* comment char */
+       *r++ = '\\';
+      *r++ = c;
     }
 
   *r = '\0';
index a62ce7cbfb3a9b1c1d72c62460b7abf9a270ed94..ab17b93d2a1a1c009882ec2d149a89aadc5e7388 100644 (file)
@@ -1,16 +1,18 @@
 # Chinese (Simplified) translation for bash package
-# Copyright (C) 2010 Free Software Foundation, Inc.
+# Copyright (C) 2010, 2011 Free Software Foundation, Inc.
 # This file is distributed under the same license as the bash package.
-# Xin Ye <alyex.ye@gmail.com>, 2010
+# Xin Ye <alyex.ye@gmail.com>, 2010.
+# Aron Xu <happyaron.xu@gmail.com>, 2011.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: bash 4.1\n"
+"Project-Id-Version: bash 4.2\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2011-01-28 22:09-0500\n"
-"PO-Revision-Date: 2010-06-29 10:16+0800\n"
-"Last-Translator: Alex Ye <alyex.ye@gmail.com>\n"
+"PO-Revision-Date: 2011-09-07 10:32+0800\n"
+"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
+"Language: zh_CN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -18,7 +20,7 @@ msgstr ""
 
 #: arrayfunc.c:50
 msgid "bad array subscript"
-msgstr "坏的数组下标"
+msgstr "数组下标不正确"
 
 #: arrayfunc.c:313 builtins/declare.def:487
 #, c-format
@@ -71,7 +73,7 @@ msgstr "`%s': 无效的别名"
 
 #: builtins/bind.def:120 builtins/bind.def:123
 msgid "line editing not enabled"
-msgstr "行编辑未启用"
+msgstr "未启用行编辑"
 
 #: builtins/bind.def:206
 #, c-format
@@ -119,7 +121,7 @@ msgid ""
 msgstr ""
 "返回当前子例程调用的上下文\n"
 "    \n"
-"    不带 EXPR 时, 返回"
+"    不带 EXPR 时,返回"
 
 #: builtins/cd.def:235
 msgid "HOME not set"
@@ -245,7 +247,7 @@ msgstr "受限的"
 #: builtins/common.c:312
 #, c-format
 msgid "%s: not a shell builtin"
-msgstr "%s: 不是shell内建"
+msgstr "%s: 不是 shell 内建"
 
 #: builtins/common.c:321
 #, c-format
@@ -281,7 +283,7 @@ msgstr "%s: 无效的动作名"
 #: builtins/complete.def:853
 #, c-format
 msgid "%s: no completion specification"
-msgstr "%s: æ²¡æ\9c\89è¡¥å®\8c声明"
+msgstr "%s: æ²¡æ\9c\89è¡¥å\85¨声明"
 
 #: builtins/complete.def:696
 msgid "warning: -F option may not work as you expect"
@@ -293,7 +295,7 @@ msgstr "警告: -C 选项可能不像您预期的那样工作"
 
 #: builtins/complete.def:826
 msgid "not currently executing completion function"
-msgstr "目前不在执行补完功能"
+msgstr "当前未执行补完功能"
 
 #: builtins/declare.def:124
 msgid "can only be used in a function"
@@ -311,7 +313,7 @@ msgstr "%s: 只读函数"
 #: builtins/declare.def:474
 #, c-format
 msgid "%s: cannot destroy array variables in this way"
-msgstr "%s: 无法以这种方式毁数组变量"
+msgstr "%s: 无法以这种方式毁数组变量"
 
 #: builtins/declare.def:481
 #, c-format
@@ -335,7 +337,7 @@ msgstr "无法在共享对象 %2$s 中找到 %1$s: %3$s"
 #: builtins/enable.def:459
 #, c-format
 msgid "%s: not dynamically loaded"
-msgstr "%s: 不是动态加载"
+msgstr "%s: 未以动态方式加载"
 
 #: builtins/enable.def:474
 #, c-format
@@ -372,11 +374,11 @@ msgstr "%s: 无法执行: %s"
 #: builtins/exit.def:65
 #, c-format
 msgid "logout\n"
-msgstr "登出\n"
+msgstr "注销\n"
 
 #: builtins/exit.def:88
 msgid "not login shell: use `exit'"
-msgstr "不是登录shell: 使用 `exit'"
+msgstr "不是登录 shell: 使用 `exit'"
 
 #: builtins/exit.def:120
 #, c-format
@@ -408,7 +410,7 @@ msgstr "当前"
 #: builtins/fg_bg.def:158
 #, c-format
 msgid "job %d started without job control"
-msgstr "不带任务控制的情况下启动了任务 %d"
+msgstr "不带任务控制的情况下启动了任务 %d"
 
 #: builtins/getopt.c:110
 #, c-format
@@ -422,7 +424,7 @@ msgstr "%s: 选项需要一个参数 -- %c\n"
 
 #: builtins/hash.def:92
 msgid "hashing disabled"
-msgstr "å\93\88å¸\8cå·²ç¦\81ç\94¨"
+msgstr "å·²ç¦\81ç\94¨å\93\88å¸\8c"
 
 #: builtins/hash.def:138
 #, c-format
@@ -438,15 +440,12 @@ msgstr "命中\t命令\n"
 #, c-format
 msgid "Shell commands matching keyword `"
 msgid_plural "Shell commands matching keywords `"
-msgstr[0] "Shell命令匹配关键字`"
+msgstr[0] "Shell 命令匹配关键字 `"
 
 #: builtins/help.def:168
 #, c-format
-msgid ""
-"no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'."
-msgstr ""
-"没有与 `%s' 匹配的帮助主题。尝试 `help help' 或者 `man -k %s' 或者 `info %"
-"s'。"
+msgid "no help topics match `%s'.  Try `help help' or `man -k %s' or `info %s'."
+msgstr "没有与 `%s' 匹配的帮助主题。尝试 `help help' 或 `man -k %s' 或 `info %s'。"
 
 #: builtins/help.def:185
 #, c-format
@@ -464,12 +463,12 @@ msgid ""
 "A star (*) next to a name means that the command is disabled.\n"
 "\n"
 msgstr ""
-"这些 shell 命令是内部定义的。请输入 `help' 以获取一个列表.\n"
-"输入 `help 名称' 以得到有关函数`名称'的更多信息.\n"
-"使用 `info bash' 来获得关于 shell 的更多一般性信息\n"
-"使用 `man -k' 或 `info' 来获取不在列表中的命令的更多信息.\n"
+"这些 shell 命令是内部定义的。请输入 `help' 以获取一个列表\n"
+"输入 `help 名称' 以得到有关函数`名称'的更多信息\n"
+"使用 `info bash' 来获得关于 shell 的更多一般性信息\n"
+"使用 `man -k' 或 `info' 来获取不在列表中的命令的更多信息\n"
 "\n"
-"名称旁边的星号 (*) 意味着该命令被禁用.\n"
+"名称旁边的星号(*)表示该命令被禁用。\n"
 "\n"
 
 #: builtins/history.def:154
@@ -505,7 +504,7 @@ msgstr "未知错误"
 
 #: builtins/let.def:95 builtins/let.def:120 expr.c:552 expr.c:567
 msgid "expression expected"
-msgstr "期待表达式"
+msgstr "需要表达式"
 
 #: builtins/mapfile.def:172
 #, c-format
@@ -551,9 +550,9 @@ msgid "`%s': missing format character"
 msgstr "`%s': 缺少格式字符"
 
 #: builtins/printf.def:448
-#, fuzzy, c-format
+#, c-format
 msgid "`%c': invalid time format specification"
-msgstr "%s: 无效的超时声明"
+msgstr "`%c': 无效的时间格式声明"
 
 #: builtins/printf.def:635
 #, c-format
@@ -567,12 +566,12 @@ msgstr "警告: %s: %s"
 
 #: builtins/printf.def:840
 msgid "missing hex digit for \\x"
-msgstr "使用了\\x但缺少十六进制数"
+msgstr "使用了 \\x 但缺少十六进制数"
 
 #: builtins/printf.def:855
-#, fuzzy, c-format
+#, c-format
 msgid "missing unicode digit for \\%c"
-msgstr "使用了\\x但缺少十六进制数"
+msgstr "使用了 \\%c 但缺少 unicode 数"
 
 #: builtins/pushd.def:195
 msgid "no other directory"
@@ -605,17 +604,15 @@ msgid ""
 "    \twith its position in the stack\n"
 "    \n"
 "    Arguments:\n"
-"      +N\tDisplays the Nth entry counting from the left of the list shown "
-"by\n"
+"      +N\tDisplays the Nth entry counting from the left of the list shown by\n"
 "    \tdirs when invoked without options, starting with zero.\n"
 "    \n"
-"      -N\tDisplays the Nth entry counting from the right of the list shown "
-"by\n"
+"      -N\tDisplays the Nth entry counting from the right of the list shown by\n"
 "\tdirs when invoked without options, starting with zero."
 msgstr ""
-"显示当前记住的目录列表 目录\n"
-"    通过 `pushd' 命令加入这个列表您可以\n"
-"    使用 `popd' 命令对列表进行遍历.\n"
+"显示当前记住的目录列表 目录\n"
+"    通过 `pushd' 命令加入这个列表您可以\n"
+"    使用 `popd' 命令对列表进行遍历\n"
 "    \n"
 "    选项:\n"
 "      -c\t删除所有元素以清除目录栈\n"
@@ -627,10 +624,10 @@ msgstr ""
 "    \n"
 "    参数:\n"
 "      +N\t以 dirs 不带选项输出的顺序显示列表从左起第N个条目,\n"
-"    \t从 0 开始.\n"
+"    \t从 0 开始\n"
 "    \n"
 "      -N\t以 dirs 不带选项输出的顺序显示列表从右起第N个项目,\n"
-"\t从 0 开始."
+"\t从 0 开始"
 
 #: builtins/pushd.def:705
 msgid ""
@@ -656,27 +653,27 @@ msgid ""
 "    \n"
 "    The `dirs' builtin displays the directory stack."
 msgstr ""
-"在目录栈顶部加入一个目录, 或者轮转\n"
-"    目录栈是当前工作目录成为新的栈顶\n"
-"    不带参数时,交换栈顶的两个目录.\n"
+"在目录栈顶部加入一个目录,或者论询\n"
+"    目录栈是当前工作目录成为新的栈顶\n"
+"    不带参数时,交换栈顶的两个目录\n"
 "    \n"
 "    选项:\n"
 "      -n\t抑制增加栈中目录时通常的改变目录的操作,\n"
 "    \t从而只有栈被操作。\n"
 "    \n"
 "    参数:\n"
-"      +N\t轮转栈使得第N个目录`dirs' 的\n"
-"    \t输出列表中左起,从0开始\n"
+"      +N\t轮转栈使得第N个目录(`dirs' 的\n"
+"    \t输出列表中左起,从0开始)\n"
 "    \t升至栈顶。\n"
 "    \n"
-"      -N\t轮转栈使得第N个目录`dirs' 的\n"
-"    \t输出列表中右起,从0开始\n"
+"      -N\t轮转栈使得第N个目录(`dirs' 的\n"
+"    \t输出列表中右起,从0开始)\n"
 "    \t升至栈顶\n"
 "    \n"
 "      dir\t添加目录至栈顶,并\n"
 "    \t使其成为新的当前工作目录。\n"
 "    \n"
-"    `dirs' å\86\85åµ\8c命令显示目录栈."
+"    `dirs' å\86\85建命令显示目录栈."
 
 #: builtins/pushd.def:730
 msgid ""
@@ -708,13 +705,13 @@ msgstr ""
 "    参数:\n"
 "      +N\t从 `dirs' 输出的列表中,\n"
 "    \t删除左起第N个条目,计数从0开始。例如:`popd +0'\n"
-"    \t删除第一个目录, `popd +1' 删除第二个。\n"
+"    \t删除第一个目录,`popd +1' 删除第二个。\n"
 "    \n"
 "      -N\t从 `dirs' 输出的列表中,\n"
 "    \t删除右起第N个条目,计数从0开始,例如:`popd -0'\n"
-"    \t删除最后一个条目, `popd -1' 删除倒数第二个。\n"
+"    \t删除最后一个条目,`popd -1' 删除倒数第二个。\n"
 "    \n"
-"    `dirs' å\86\85åµ\8c变量显示目录栈。"
+"    `dirs' å\86\85建变量显示目录栈。"
 
 #: builtins/read.def:252
 #, c-format
@@ -728,21 +725,21 @@ msgstr "读错误: %d: %s"
 
 #: builtins/return.def:73
 msgid "can only `return' from a function or sourced script"
-msgstr "只能从函数或者源脚本`返回'"
+msgstr "只能从函数或者源脚本返回(`return')"
 
 #: builtins/set.def:771
 msgid "cannot simultaneously unset a function and a variable"
-msgstr "æ\97 æ³\95å\90\8cæ\97¶å\8f\8d设定一个函数和一个变量"
+msgstr "æ\97 æ³\95å\90\8cæ\97¶å\8f\96æ¶\88设定一个函数和一个变量"
 
 #: builtins/set.def:808
 #, c-format
 msgid "%s: cannot unset"
-msgstr "%s: æ\97 æ³\95å\8f\8d设定"
+msgstr "%s: æ\97 æ³\95å\8f\96æ¶\88设定"
 
 #: builtins/set.def:815
 #, c-format
 msgid "%s: cannot unset: readonly %s"
-msgstr "%s: æ\97 æ³\95å\8f\8d设定: 只读 %s"
+msgstr "%s: æ\97 æ³\95å\8f\96æ¶\88设定: 只读 %s"
 
 #: builtins/set.def:826
 #, c-format
@@ -760,7 +757,7 @@ msgstr "位移计数"
 
 #: builtins/shopt.def:264
 msgid "cannot set and unset shell options simultaneously"
-msgstr "æ\97 æ³\95å\90\8cæ\97¶è®¾å®\9aå\92\8cå\8f\8d设定 shell 选项"
+msgstr "æ\97 æ³\95å\90\8cæ\97¶è®¾å®\9aå\92\8cå\8f\96æ¶\88设定 shell 选项"
 
 #: builtins/shopt.def:329
 #, c-format
@@ -774,7 +771,7 @@ msgstr "需要文件名参数"
 #: builtins/source.def:155
 #, c-format
 msgid "%s: file not found"
-msgstr "%s: æ²¡æ\9c\89æ\89¾å\88°æ\96\87件"
+msgstr "%s: æ\96\87件æ\9cªæ\89¾å\88°"
 
 #: builtins/suspend.def:101
 msgid "cannot suspend"
@@ -782,7 +779,7 @@ msgstr "无法挂起"
 
 #: builtins/suspend.def:111
 msgid "cannot suspend a login shell"
-msgstr "无法挂起一个登录shell"
+msgstr "无法挂起一个登录 shell"
 
 #: builtins/type.def:234
 #, c-format
@@ -802,7 +799,7 @@ msgstr "%s 是函数\n"
 #: builtins/type.def:296
 #, c-format
 msgid "%s is a shell builtin\n"
-msgstr "%s æ\98¯ shell å\86\85åµ\8c\n"
+msgstr "%s æ\98¯ shell å\86\85建\n"
 
 #: builtins/type.def:317 builtins/type.def:391
 #, c-format
@@ -812,7 +809,7 @@ msgstr "%s 是 %s\n"
 #: builtins/type.def:337
 #, c-format
 msgid "%s is hashed (%s)\n"
-msgstr "%s 已被哈希 (%s)\n"
+msgstr "%s 已经哈希操作(%s)\n"
 
 #: builtins/ulimit.def:376
 #, c-format
@@ -822,7 +819,7 @@ msgstr "%s: 无效的 limit 参数"
 #: builtins/ulimit.def:402
 #, c-format
 msgid "`%c': bad command"
-msgstr "`%c': å\9d\8fç\9a\84å\91½ä»¤"
+msgstr "`%c': å\91½ä»¤é\94\99误"
 
 #: builtins/ulimit.def:431
 #, c-format
@@ -864,7 +861,7 @@ msgstr "上一个命令: %s\n"
 #: error.c:173
 #, c-format
 msgid "Aborting..."
-msgstr "放弃..."
+msgstr "中止..."
 
 #: error.c:406
 msgid "unknown command error"
@@ -872,25 +869,25 @@ msgstr "未知的命令错误"
 
 #: error.c:407
 msgid "bad command type"
-msgstr "的命令类型"
+msgstr "错误的命令类型"
 
 #: error.c:408
 msgid "bad connector"
-msgstr "的条件连接符"
+msgstr "错误的条件连接符"
 
 #: error.c:409
 msgid "bad jump"
-msgstr "的跳转"
+msgstr "错误的跳转"
 
 #: error.c:447
 #, c-format
 msgid "%s: unbound variable"
-msgstr "%s: 为绑定变量"
+msgstr "%s: 未绑定的变量"
 
 #: eval.c:181
 #, c-format
 msgid "\atimed out waiting for input: auto-logout\n"
-msgstr "\a 等待输入超时:自动登出\n"
+msgstr "\a 等待输入超时:自动注销\n"
 
 #: execute_cmd.c:504
 #, c-format
@@ -917,19 +914,19 @@ msgid "%s: command not found"
 msgstr "%s: 未找到命令"
 
 #: execute_cmd.c:4959
-#, fuzzy, c-format
+#, c-format
 msgid "%s: %s"
-msgstr "%s 是 %s\n"
+msgstr "%s: %s"
 
 #: execute_cmd.c:4995
 #, c-format
 msgid "%s: %s: bad interpreter"
-msgstr "%s: %s: 坏的解释器"
+msgstr "%s: %s: 解释器错误"
 
 #: execute_cmd.c:5144
 #, c-format
 msgid "cannot duplicate fd %d to fd %d"
-msgstr "无法复制文件描述符 %d 到 文件描述符 %d"
+msgstr "无法复制文件描述符 %d 到文件描述符 %d"
 
 #: expr.c:256
 msgid "expression recursion level exceeded"
@@ -953,11 +950,11 @@ msgstr "除0"
 
 #: expr.c:517
 msgid "bug: bad expassign token"
-msgstr "错误:坏的表达式赋值符号"
+msgstr "错误:表达式赋值符号错误"
 
 #: expr.c:564
 msgid "`:' expected for conditional expression"
-msgstr "条件表达式期待 `:'"
+msgstr "条件表达式需要 `:'"
 
 #: expr.c:832
 msgid "exponent less than 0"
@@ -973,7 +970,7 @@ msgstr "缺少 `)'"
 
 #: expr.c:959 expr.c:1282
 msgid "syntax error: operand expected"
-msgstr "语法错误: 期待操作数"
+msgstr "语法错误: 需要操作数"
 
 #: expr.c:1284
 msgid "syntax error: invalid arithmetic operator"
@@ -982,7 +979,7 @@ msgstr "语法错误: 无效的算术运算符"
 #: expr.c:1308
 #, c-format
 msgid "%s%s%s: %s (error token is \"%s\")"
-msgstr "%s%s%s: %s (错误符号是 \"%s\")"
+msgstr "%s%s%s: %s (错误符号是 \"%s\")"
 
 #: expr.c:1366
 msgid "invalid arithmetic base"
@@ -1052,7 +1049,7 @@ msgstr "信号 %d"
 
 #: jobs.c:1459 jobs.c:1484
 msgid "Done"
-msgstr "完成"
+msgstr "å·²å®\8cæ\88\90"
 
 #: jobs.c:1464 siglist.c:123
 msgid "Stopped"
@@ -1061,7 +1058,7 @@ msgstr "已停止"
 #: jobs.c:1468
 #, c-format
 msgid "Stopped(%s)"
-msgstr "已停止 (%s)"
+msgstr "已停止(%s)"
 
 #: jobs.c:1472
 msgid "Running"
@@ -1070,7 +1067,7 @@ msgstr "运行中"
 #: jobs.c:1486
 #, c-format
 msgid "Done(%d)"
-msgstr "å®\8cæ\88\90 (%d)"
+msgstr "å·²å®\8cæ\88\90(%d)"
 
 #: jobs.c:1488
 #, c-format
@@ -1084,12 +1081,12 @@ msgstr "未知状态"
 #: jobs.c:1578
 #, c-format
 msgid "(core dumped) "
-msgstr "(吐核)"
+msgstr "(核心已转储)"
 
 #: jobs.c:1597
 #, c-format
 msgid "  (wd: %s)"
-msgstr "(工作目录:%s)"
+msgstr "  (工作目录: %s)"
 
 #: jobs.c:1805
 #, c-format
@@ -1133,7 +1130,7 @@ msgstr "%s: 行 %d: "
 #: jobs.c:3552 nojobs.c:814
 #, c-format
 msgid " (core dumped)"
-msgstr "(吐核)"
+msgstr " (核心已转储)"
 
 #: jobs.c:3564 jobs.c:3577
 #, c-format
@@ -1155,7 +1152,7 @@ msgstr "initialize_job_control: setpgid"
 #: jobs.c:3707
 #, c-format
 msgid "cannot set terminal process group (%d)"
-msgstr "无法设定终端进程组 (%d)"
+msgstr "无法设定终端进程组(%d)"
 
 #: jobs.c:3712
 msgid "no job control in this shell"
@@ -1193,11 +1190,11 @@ msgstr "free: 用未分配的块作为参数被调用"
 
 #: lib/malloc/malloc.c:896
 msgid "free: underflow detected; mh_nbytes out of range"
-msgstr "free: 检测到下溢; mh_nbytes越界"
+msgstr "free: 检测到下溢;mh_nbytes 越界"
 
 #: lib/malloc/malloc.c:902
 msgid "free: start and end chunk sizes differ"
-msgstr "free: 起始和终结块大小不一致"
+msgstr "free: 其实和末尾块大小不一致"
 
 #: lib/malloc/malloc.c:1001
 msgid "realloc: called with unallocated block argument"
@@ -1205,26 +1202,26 @@ msgstr "realloc: 用未分配的块作为参数被调用"
 
 #: lib/malloc/malloc.c:1016
 msgid "realloc: underflow detected; mh_nbytes out of range"
-msgstr "realloc: 检测到下溢; mh_nbytes越界"
+msgstr "realloc: 检测到下溢;mh_nbytes 越界"
 
 #: lib/malloc/malloc.c:1022
 msgid "realloc: start and end chunk sizes differ"
-msgstr "realloc: 起始和终结块大小不一致"
+msgstr "realloc: 其实和末尾块大小不一致"
 
 #: lib/malloc/table.c:177
 #, c-format
 msgid "register_alloc: alloc table is full with FIND_ALLOC?\n"
-msgstr "register_alloc: 分配表已经充满了 FIND_ALLOC?\n"
+msgstr "register_alloc: 分配表已经充满了 FIND_ALLOC\n"
 
 #: lib/malloc/table.c:184
 #, c-format
 msgid "register_alloc: %p already in table as allocated?\n"
-msgstr "register_alloc: %p 在表中显示为已分配?\n"
+msgstr "register_alloc: %p 在表中显示为已分配\n"
 
 #: lib/malloc/table.c:220
 #, c-format
 msgid "register_free: %p already in table as free?\n"
-msgstr "register_free: %p 在表中显示为已释放?\n"
+msgstr "register_free: %p 在表中显示为已释放\n"
 
 #: lib/sh/fmtulong.c:101
 msgid "invalid base"
@@ -1243,7 +1240,7 @@ msgstr "%s: 无效的服务"
 #: lib/sh/netopen.c:306
 #, c-format
 msgid "%s: bad network path specification"
-msgstr "%s: 的网络路径声明"
+msgstr "%s: 错误的网络路径声明"
 
 #: lib/sh/netopen.c:346
 msgid "network operations not supported"
@@ -1288,7 +1285,7 @@ msgstr "语法错误: 需要算数表达式"
 
 #: make_cmd.c:325
 msgid "syntax error: `;' unexpected"
-msgstr "语法错误: 期待 `;'"
+msgstr "语法错误: 需要 `;'"
 
 #: make_cmd.c:326
 #, c-format
@@ -1298,7 +1295,7 @@ msgstr "语法错误: `((%s))'"
 #: make_cmd.c:575
 #, c-format
 msgid "make_here_document: bad instruction type %d"
-msgstr "make_here_document: 的指令类型 %d"
+msgstr "make_here_document: 错误的指令类型 %d"
 
 #: make_cmd.c:659
 #, c-format
@@ -1331,11 +1328,11 @@ msgstr "条件表达式中有语法错误"
 #: parse.y:4112
 #, c-format
 msgid "unexpected token `%s', expected `)'"
-msgstr "未预期的符号 `%s' ,期待 `)'"
+msgstr "未预期的符号 `%s' ,需要 `)'"
 
 #: parse.y:4116
 msgid "expected `)'"
-msgstr "期待 `)'"
+msgstr "需要 `)'"
 
 #: parse.y:4144
 #, c-format
@@ -1349,11 +1346,11 @@ msgstr "一元条件运算符使用了未预期的参数"
 #: parse.y:4194
 #, c-format
 msgid "unexpected token `%s', conditional binary operator expected"
-msgstr "未预期的符号 `%s',期待二元条件运算符"
+msgstr "未预期的符号 `%s',需要二元条件运算符"
 
 #: parse.y:4198
 msgid "conditional binary operator expected"
-msgstr "期待二元条件运算符"
+msgstr "需要二元条件运算符"
 
 #: parse.y:4220
 #, c-format
@@ -1419,7 +1416,7 @@ msgstr "progcomp_insert: %s: 空的补完声明"
 #: print_cmd.c:296
 #, c-format
 msgid "print_command: bad connector `%d'"
-msgstr "print_command: 的条件连接符 `%d'"
+msgstr "print_command: 错误的条件连接符 `%d'"
 
 #: print_cmd.c:368
 #, c-format
@@ -1533,7 +1530,7 @@ msgstr "请输入`%s -c \"help set\"' 以获得关于 shell 选项的更多信
 #: shell.c:1825
 #, c-format
 msgid "Type `%s -c help' for more information about shell builtin commands.\n"
-msgstr "请è¾\93å\85¥ `%s -c help' ä»¥è\8e·å¾\97å\85³äº\8e shell å\86\85åµ\8c命令的更多信息.\n"
+msgstr "请è¾\93å\85¥ `%s -c help' ä»¥è\8e·å¾\97å\85³äº\8e shell å\86\85建命令的更多信息.\n"
 
 #: shell.c:1826
 #, c-format
@@ -1595,11 +1592,11 @@ msgstr "段错误"
 
 #: siglist.c:99
 msgid "Bad system call"
-msgstr "的系统调用"
+msgstr "错误的系统调用"
 
 #: siglist.c:103
 msgid "Broken pipe"
-msgstr "ç ´è£\82ç\9a\84管é\81\93"
+msgstr "管é\81\93ç ´è£\82"
 
 #: siglist.c:107
 msgid "Alarm clock"
@@ -1611,7 +1608,7 @@ msgstr "已终止"
 
 #: siglist.c:115
 msgid "Urgent IO condition"
-msgstr "紧急输入输出情形"
+msgstr "紧急 I/O 状况"
 
 #: siglist.c:119
 msgid "Stopped (signal)"
@@ -1627,15 +1624,15 @@ msgstr "子进程已死或者停止"
 
 #: siglist.c:139
 msgid "Stopped (tty input)"
-msgstr "已停止 (tty 输入)"
+msgstr "已停止(tty 输入)"
 
 #: siglist.c:143
 msgid "Stopped (tty output)"
-msgstr "已停止 (tty 输出)"
+msgstr "已停止(tty 输出)"
 
 #: siglist.c:147
 msgid "I/O ready"
-msgstr "输入输出准备完毕"
+msgstr "I/O 就绪"
 
 #: siglist.c:151
 msgid "CPU limit"
@@ -1650,12 +1647,13 @@ msgid "Alarm (virtual)"
 msgstr "报警(虚拟)"
 
 #: siglist.c:163
+#, fuzzy
 msgid "Alarm (profile)"
 msgstr "报警(总结)"
 
 #: siglist.c:167
 msgid "Window changed"
-msgstr "窗口改变"
+msgstr "窗口改变"
 
 #: siglist.c:171
 msgid "Record lock"
@@ -1663,15 +1661,15 @@ msgstr "记录锁"
 
 #: siglist.c:175
 msgid "User signal 1"
-msgstr "用户定义信号1"
+msgstr "用户信号1"
 
 #: siglist.c:179
 msgid "User signal 2"
-msgstr "用户定义信号2"
+msgstr "用户信号2"
 
 #: siglist.c:183
 msgid "HFT input data pending"
-msgstr "HFT输入数据挂起"
+msgstr "HFT 待输入数据"
 
 #: siglist.c:187
 msgid "power failure imminent"
@@ -1683,27 +1681,27 @@ msgstr "系统即将崩溃"
 
 #: siglist.c:195
 msgid "migrate process to another CPU"
-msgstr "迁移进程至另一个CPU"
+msgstr "迁移进程至另一个 CPU"
 
 #: siglist.c:199
 msgid "programming error"
-msgstr "ç¨\8båº\8f错误"
+msgstr "ç¼\96ç¨\8b错误"
 
 #: siglist.c:203
 msgid "HFT monitor mode granted"
-msgstr "HFT显示器模式授与"
+msgstr "已授予 HFT 监视模式"
 
 #: siglist.c:207
 msgid "HFT monitor mode retracted"
-msgstr "HFT显示器模式撤销"
+msgstr "已撤销 HFT 监视模式"
 
 #: siglist.c:211
 msgid "HFT sound sequence has completed"
-msgstr "HFT声音序列已完成"
+msgstr "已完成 HFT 声音序列"
 
 #: siglist.c:215
 msgid "Information request"
-msgstr "状态请求"
+msgstr "信息请求"
 
 #: siglist.c:223
 msgid "Unknown Signal #"
@@ -1717,7 +1715,7 @@ msgstr "未知信号 #%d"
 #: subst.c:1333 subst.c:1502
 #, c-format
 msgid "bad substitution: no closing `%s' in %s"
-msgstr "坏的替换:在 %2$s 中没有闭合的 `%1$s'"
+msgstr "错误的替换: 在 %2$s 中没有闭合的 `%1$s'"
 
 #: subst.c:2795
 #, c-format
@@ -1772,7 +1770,7 @@ msgstr "%s: 子串表达式 < 0"
 #: subst.c:7271
 #, c-format
 msgid "%s: bad substitution"
-msgstr "%s: 的替换"
+msgstr "%s: 错误的替换"
 
 #: subst.c:7347
 #, c-format
@@ -1780,48 +1778,46 @@ msgid "$%s: cannot assign in this way"
 msgstr "$%s: 无法这样赋值"
 
 #: subst.c:7684
-msgid ""
-"future versions of the shell will force evaluation as an arithmetic "
-"substitution"
+msgid "future versions of the shell will force evaluation as an arithmetic substitution"
 msgstr "未来版本的 shell 会强制估值为算数替换"
 
 #: subst.c:8149
 #, c-format
 msgid "bad substitution: no closing \"`\" in %s"
-msgstr "坏的替换:在 %s 中没有闭合的 \"`\""
+msgstr "错误的替换: 在 %s 中没有闭合的 \"`\""
 
 #: subst.c:9036
 #, c-format
 msgid "no match: %s"
-msgstr "没æ\9c\89匹配: %s"
+msgstr "æ\97 匹配: %s"
 
 #: test.c:146
 msgid "argument expected"
-msgstr "期待参数"
+msgstr "需要参数"
 
 #: test.c:155
 #, c-format
 msgid "%s: integer expression expected"
-msgstr "%s: 期待整数表达式"
+msgstr "%s: 需要整数表达式"
 
 #: test.c:263
 msgid "`)' expected"
-msgstr "期待 `)'"
+msgstr "需要 `)'"
 
 #: test.c:265
 #, c-format
 msgid "`)' expected, found %s"
-msgstr "期待`)' , 得到 %s"
+msgstr "需要`)',得到 %s"
 
 #: test.c:280 test.c:698 test.c:701
 #, c-format
 msgid "%s: unary operator expected"
-msgstr "%s: 期待一元表达式"
+msgstr "%s: 需要一元表达式"
 
 #: test.c:449 test.c:741
 #, c-format
 msgid "%s: binary operator expected"
-msgstr "%s: 期待二元表达式"
+msgstr "%s: 需要二元表达式"
 
 #: test.c:816
 msgid "missing `]'"
@@ -1829,23 +1825,22 @@ msgstr "缺少 `]'"
 
 #: trap.c:207
 msgid "invalid signal number"
-msgstr "无效的信号编号"
+msgstr "无效的信号"
 
 #: trap.c:337
 #, c-format
 msgid "run_pending_traps: bad value in trap_list[%d]: %p"
-msgstr "run_pending_traps: trap_list[%d] 中的值: %p"
+msgstr "run_pending_traps: trap_list[%d] 中的错误值: %p"
 
 #: trap.c:341
 #, c-format
-msgid ""
-"run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
-msgstr "run_pending_traps: 信号处理器是 SIG_DFL, 重新发送 %d (%s) 给自己"
+msgid "run_pending_traps: signal handler is SIG_DFL, resending %d (%s) to myself"
+msgstr "run_pending_traps: 信号处理器是 SIG_DFL,重新发送 %d (%s) 给自己"
 
 #: trap.c:393
 #, c-format
 msgid "trap_handler: bad signal %d"
-msgstr "trap_handler: 的信号 %d"
+msgstr "trap_handler: 错误的信号 %d"
 
 #: variables.c:363
 #, c-format
@@ -1855,7 +1850,7 @@ msgstr "`%s' 函数定义导入错误"
 #: variables.c:755
 #, c-format
 msgid "shell level (%d) too high, resetting to 1"
-msgstr "shell 层次 (%d) 太高, 重置为 1"
+msgstr "shell 层次 (%d) 太高,重置为 1"
 
 #: variables.c:1932
 msgid "make_local_variable: no function context at current scope"
@@ -1903,51 +1898,42 @@ msgid "%s: %s: invalid value for trace file descriptor"
 msgstr "%s: %s: 追踪文件描述符的值无效"
 
 #: version.c:46
-#, fuzzy
 msgid "Copyright (C) 2011 Free Software Foundation, Inc."
-msgstr "自由软件基金会 版权所有 2009"
+msgstr "版权所有 (C) 2011 自由软件基金会"
 
 #: version.c:47
-msgid ""
-"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl."
-"html>\n"
-msgstr ""
-"许可证 GPLv3+: GNU GPL 许可证版本3或者更高 <http://gnu.org/licenses/gpl."
-"html>\n"
+msgid "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n"
+msgstr "许可证 GPLv3+: GNU GPL 许可证第三版或者更新版本 <http://gnu.org/licenses/gpl.html>\n"
 
 #: version.c:86 version2.c:83
 #, c-format
 msgid "GNU bash, version %s (%s)\n"
-msgstr "GNU bash, 版本 %s (%s)\n"
+msgstr "GNU bash,版本 %s (%s)\n"
 
 #: version.c:91 version2.c:88
 #, c-format
 msgid "This is free software; you are free to change and redistribute it.\n"
-msgstr "是自由软件,您可以自由地更改和重新发布。\n"
+msgstr "本软件是自由软件,您可以自由地更改和重新发布。\n"
 
 #: version.c:92 version2.c:89
 #, c-format
 msgid "There is NO WARRANTY, to the extent permitted by law.\n"
-msgstr "在法律允许的范围内没有担保.\n"
+msgstr "在法律许可的情况下特此明示,本软件不提供任何担保。\n"
 
 #: version2.c:86
 #, c-format
 msgid "Copyright (C) 2009 Free Software Foundation, Inc.\n"
-msgstr "自由软件基金会 版权所有 2009\n"
+msgstr "版权所有 (C) 2009 自由软件基金会\n"
 
 #: version2.c:87
 #, c-format
-msgid ""
-"License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl."
-"html>\n"
-msgstr ""
-"许可证 GPLv2+: GNU GPL 许可证版本2或者更高 <http://gnu.org/licenses/gpl."
-"html>\n"
+msgid "License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>\n"
+msgstr "许可证 GPLv2+: GNU GPL 许可证第二版或者更新版本 <http://gnu.org/licenses/gpl.html>\n"
 
 #: xmalloc.c:91
 #, c-format
 msgid "%s: cannot allocate %lu bytes (%lu bytes allocated)"
-msgstr "%s: 无法分配 %lu 字节 (%lu 字节已分配)"
+msgstr "%s: 无法分配 %lu 字节(已分配 %lu 字节)"
 
 #: xmalloc.c:93
 #, c-format
@@ -1957,7 +1943,7 @@ msgstr "%s: 无法分配 %lu 字节"
 #: xmalloc.c:163
 #, c-format
 msgid "%s: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"
-msgstr "%s: %s:%d: 无法分配 %lu 字节 (%lu 字节已分配)"
+msgstr "%s: %s:%d: 无法分配 %lu 字节(已分配 %lu 字节)"
 
 #: xmalloc.c:165
 #, c-format
@@ -1973,12 +1959,8 @@ msgid "unalias [-a] name [name ...]"
 msgstr "unalias [-a] 名称 [名称 ...]"
 
 #: builtins.c:51
-msgid ""
-"bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-"
-"x keyseq:shell-command] [keyseq:readline-function or readline-command]"
-msgstr ""
-"bind [-lpvsPVS] [-m 键映射] [-f 文件名] [-q 名称] [-u 名称] [-r 键序列] [-x "
-"键序列:shell命令] [键序列:行读取函数 或 行读取命令]"
+msgid "bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:readline-function or readline-command]"
+msgstr "bind [-lpvsPVS] [-m 键映射] [-f 文件名] [-q 名称] [-u 名称] [-r 键序列] [-x 键序列:shell命令] [键序列:行读取函数 或 行读取命令]"
 
 #: builtins.c:54
 msgid "break [n]"
@@ -1990,16 +1972,15 @@ msgstr "continue [n]"
 
 #: builtins.c:58
 msgid "builtin [shell-builtin [arg ...]]"
-msgstr "builtin [shell å\86\85åµ\8c [参数 ...]]"
+msgstr "builtin [shell å\86\85建 [参数 ...]]"
 
 #: builtins.c:61
 msgid "caller [expr]"
 msgstr "caller [表达式]"
 
 #: builtins.c:64
-#, fuzzy
 msgid "cd [-L|[-P [-e]]] [dir]"
-msgstr "cd [-L|-P] [目录]"
+msgstr "cd [-L|[-P [-e]]] [目录]"
 
 #: builtins.c:66
 msgid "pwd [-LP]"
@@ -2011,25 +1992,23 @@ msgstr ":"
 
 #: builtins.c:70
 msgid "true"
-msgstr ""
+msgstr "true"
 
 #: builtins.c:72
 msgid "false"
-msgstr ""
+msgstr "false"
 
 #: builtins.c:74
 msgid "command [-pVv] command [arg ...]"
 msgstr "command [-pVv] 命令 [参数 ...]"
 
 #: builtins.c:76
-#, fuzzy
 msgid "declare [-aAfFgilrtux] [-p] [name[=value] ...]"
-msgstr "declare [-aAfFilrtux] [-p] [名称[=值] ...]"
+msgstr "declare [-aAfFgilrtux] [-p] [名称[=值] ...]"
 
 #: builtins.c:78
-#, fuzzy
 msgid "typeset [-aAfFgilrtux] [-p] name[=value] ..."
-msgstr "typeset [-aAfFilrtux] [-p] 名称[=值] ..."
+msgstr "typeset [-aAfFgilrtux] [-p] 名称[=值] ..."
 
 #: builtins.c:80
 msgid "local [option] name[=value] ..."
@@ -2088,12 +2067,8 @@ msgid "help [-dms] [pattern ...]"
 msgstr "help [-dms] [模式 ...]"
 
 #: builtins.c:121
-msgid ""
-"history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg "
-"[arg...]"
-msgstr ""
-"history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 "
-"[参数...]"
+msgid "history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...]"
+msgstr "history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 参数 [参数...]"
 
 #: builtins.c:125
 msgid "jobs [-lnprs] [jobspec ...] or jobs -x command [args]"
@@ -2104,33 +2079,24 @@ msgid "disown [-h] [-ar] [jobspec ...]"
 msgstr "disown [-h] [-ar] [任务声明 ...]"
 
 #: builtins.c:132
-msgid ""
-"kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l "
-"[sigspec]"
-msgstr ""
-"kill [-s 信号声明 | -n 信号编号 | -信号声明] 进程号 | 任务声明 ... 或 kill -"
-"l [信号声明]"
+msgid "kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]"
+msgstr "kill [-s 信号声明 | -n 信号编号 | -信号声明] 进程号 | 任务声明 ... 或 kill -l [信号声明]"
 
 #: builtins.c:134
 msgid "let arg [arg ...]"
 msgstr "let 参数 [参数 ...]"
 
 #: builtins.c:136
-msgid ""
-"read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p "
-"prompt] [-t timeout] [-u fd] [name ...]"
-msgstr ""
-"read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字"
-"符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]"
+msgid "read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]"
+msgstr "read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]"
 
 #: builtins.c:138
 msgid "return [n]"
 msgstr "return [n]"
 
 #: builtins.c:140
-#, fuzzy
 msgid "set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]"
-msgstr "set [--abefhkmnptuvxBCHP] [-o 选项名] [参数 ...]"
+msgstr "set [--abefhkmnptuvxBCHP] [-o 选项名] [--] [参数 ...]"
 
 #: builtins.c:142
 msgid "unset [-f] [-v] [name ...]"
@@ -2141,9 +2107,8 @@ msgid "export [-fn] [name[=value] ...] or export -p"
 msgstr "export [-fn] [名称[=值] ...] 或 export -p"
 
 #: builtins.c:146
-#, fuzzy
 msgid "readonly [-aAf] [name[=value] ...] or readonly -p"
-msgstr "readonly [-af] [名称[=值] ...] 或 readonly -p"
+msgstr "readonly [-aAf] [名称[=值] ...] 或 readonly -p"
 
 #: builtins.c:148
 msgid "shift [n]"
@@ -2218,9 +2183,7 @@ msgid "case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac"
 msgstr "case 词 in [模式 [| 模式]...) 命令 ;;]... esac"
 
 #: builtins.c:192
-msgid ""
-"if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else "
-"COMMANDS; ] fi"
+msgid "if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi"
 msgstr "if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi"
 
 #: builtins.c:194
@@ -2280,41 +2243,24 @@ msgid "printf [-v var] format [arguments]"
 msgstr "printf [-v var] 格式 [参数]"
 
 #: builtins.c:229
-msgid ""
-"complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-"
-"W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S "
-"suffix] [name ...]"
-msgstr ""
-"complete [-abcdefgjksuv] [-pr] [-DE] [-o 选项] [-A 动作] [-G 全局模式] [-W 词"
-"语列表]  [-F 函数] [-C 命令] [-X 过滤模式] [-P 前缀] [-S 后缀] [名称 ...]"
+msgid "complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]"
+msgstr "complete [-abcdefgjksuv] [-pr] [-DE] [-o 选项] [-A 动作] [-G 全局模式] [-W 词语列表]  [-F 函数] [-C 命令] [-X 过滤模式] [-P 前缀] [-S 后缀] [名称 ...]"
 
 #: builtins.c:233
-msgid ""
-"compgen [-abcdefgjksuv] [-o option]  [-A action] [-G globpat] [-W wordlist]  "
-"[-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]"
-msgstr ""
-"compgen [-abcdefgjksuv] [-o 选项]  [-A 动作] [-G 全局模式] [-W 词语列表]  [-"
-"F 函数] [-C 命令] [-X 过滤模式] [-P 前缀] [-S 后缀] [词语]"
+msgid "compgen [-abcdefgjksuv] [-o option]  [-A action] [-G globpat] [-W wordlist]  [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]"
+msgstr "compgen [-abcdefgjksuv] [-o 选项]  [-A 动作] [-G 全局模式] [-W 词语列表]  [-F 函数] [-C 命令] [-X 过滤模式] [-P 前缀] [-S 后缀] [词语]"
 
 #: builtins.c:237
 msgid "compopt [-o|+o option] [-DE] [name ...]"
 msgstr "compopt [-o|+o 选项] [-DE] [名称 ...]"
 
 #: builtins.c:240
-msgid ""
-"mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c "
-"quantum] [array]"
-msgstr ""
-"mapfile [-n 计数] [-O 起始序号] [-s 计数] [-t] [-u fd] [-C 回调] [-c 量子] "
-"[数组]"
+msgid "mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]"
+msgstr "mapfile [-n 计数] [-O 起始序号] [-s 计数] [-t] [-u fd] [-C 回调] [-c 量子] [数组]"
 
 #: builtins.c:242
-msgid ""
-"readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c "
-"quantum] [array]"
-msgstr ""
-"readarray [-n 计数] [-O 起始序号] [-s 计数] [-t] [-u fd] [-C 回调] [-c 量子] "
-"[数组]"
+msgid "readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]"
+msgstr "readarray [-n 计数] [-O 起始序号] [-s 计数] [-t] [-u fd] [-C 回调] [-c 量子] [数组]"
 
 #: builtins.c:254
 msgid ""
@@ -2331,13 +2277,12 @@ msgid ""
 "      -p\tPrint all defined aliases in a reusable format\n"
 "    \n"
 "    Exit Status:\n"
-"    alias returns true unless a NAME is supplied for which no alias has "
-"been\n"
+"    alias returns true unless a NAME is supplied for which no alias has been\n"
 "    defined."
 msgstr ""
 "定义或显示别名。\n"
 "    \n"
-"    不带参数时, `alias' 以可重用的格式\n"
+"    不带参数时,`alias' 以可重用的格式\n"
 "    `alias 名称=值'在标准输出设备上打印别名列表。\n"
 "    \n"
 "    否则,对于每个给定值的名称定义一个别名。\n"
@@ -2360,10 +2305,10 @@ msgid ""
 "    \n"
 "    Return success unless a NAME is not an existing alias."
 msgstr ""
-"ä»\8eå\88«å\90\8då®\9aä¹\89å\88\97表中å\88 é\99¤æ¯\8fä¸\80个â\80\9cå\90\8då­\97â\80\98。\n"
+"ä»\8eå\88«å\90\8då®\9aä¹\89å\88\97表中å\88 é\99¤æ¯\8fä¸\80个â\80\9cå\90\8då­\97â\80\9d。\n"
 "    \n"
 "    选项:\n"
-"      -a\t删除所有的别名定义.\n"
+"      -a\t删除所有的别名定义\n"
 "    \n"
 "    返回成功,除非“名字“不是一个已存在的别名。"
 
@@ -2379,24 +2324,20 @@ msgid ""
 "    Options:\n"
 "      -m  keymap         Use KEYMAP as the keymap for the duration of this\n"
 "                         command.  Acceptable keymap names are emacs,\n"
-"                         emacs-standard, emacs-meta, emacs-ctlx, vi, vi-"
-"move,\n"
+"                         emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move,\n"
 "                         vi-command, and vi-insert.\n"
 "      -l                 List names of functions.\n"
 "      -P                 List function names and bindings.\n"
 "      -p                 List functions and bindings in a form that can be\n"
 "                         reused as input.\n"
-"      -S                 List key sequences that invoke macros and their "
-"values\n"
-"      -s                 List key sequences that invoke macros and their "
-"values\n"
+"      -S                 List key sequences that invoke macros and their values\n"
+"      -s                 List key sequences that invoke macros and their values\n"
 "                         in a form that can be reused as input.\n"
 "      -V                 List variable names and values\n"
 "      -v                 List variable names and values in a form that can\n"
 "                         be reused as input.\n"
 "      -q  function-name  Query about which keys invoke the named function.\n"
-"      -u  function-name  Unbind all keys which are bound to the named "
-"function.\n"
+"      -u  function-name  Unbind all keys which are bound to the named function.\n"
 "      -r  keyseq         Remove the binding for KEYSEQ.\n"
 "      -f  filename       Read key bindings from FILENAME.\n"
 "      -x  keyseq:shell-command\tCause SHELL-COMMAND to be executed when\n"
@@ -2449,7 +2390,7 @@ msgid ""
 msgstr ""
 "退出 for、while、或 until 循环\n"
 "    \n"
-"    退出一个 FOR、WHILE 或 UNTIL 循环。如果指定了N,则打破N重\n"
+"    退出一个 FOR、WHILE 或 UNTIL 循环。如果指定了N,则跳出N重\n"
 "    循环\n"
 "    \n"
 "    退出状态:\n"
@@ -2479,22 +2420,20 @@ msgid ""
 "    \n"
 "    Execute SHELL-BUILTIN with arguments ARGs without performing command\n"
 "    lookup.  This is useful when you wish to reimplement a shell builtin\n"
-"    as a shell function, but need to execute the builtin within the "
-"function.\n"
+"    as a shell function, but need to execute the builtin within the function.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns the exit status of SHELL-BUILTIN, or false if SHELL-BUILTIN is\n"
 "    not a shell builtin.."
 msgstr ""
-"æ\89§è¡\8c shell å\86\85åµ\8c。\n"
+"æ\89§è¡\8c shell å\86\85建。\n"
 "    \n"
-"    å¸¦å\8f\82æ\95° ARGs æ\89§è¡\8c SHELL-BUILTIN å\86\85åµ\8c,并且不做命令查询\n"
-"    å\9c¨å¸\8cæ\9c\9b以 shell å\87½æ\95°ç\9a\84å½¢å¼\8fæ\9d¥é\87\8dæ\96°å®\9eç\8e° shell å\86\85åµ\8c,\n"
-"    å¹¶ä¸\94å¸\8cæ\9c\9bå\9c¨å\87½æ\95°ä¹\8bå\86\85æ\89§è¡\8c该 shell å\86\85åµ\8c的情况下有用处。\n"
+"    å¸¦å\8f\82æ\95° ARGs æ\89§è¡\8c SHELL-BUILTIN å\86\85建,并且不做命令查询\n"
+"    å\9c¨å¸\8cæ\9c\9b以 shell å\87½æ\95°ç\9a\84å½¢å¼\8fæ\9d¥é\87\8dæ\96°å®\9eç\8e° shell å\86\85建,\n"
+"    å¹¶ä¸\94å¸\8cæ\9c\9bå\9c¨å\87½æ\95°ä¹\8bå\86\85æ\89§è¡\8c该 shell å\86\85建的情况下有用处。\n"
 "    \n"
 "    退出状态:\n"
-"    以 SHELL-BUILTIN 内嵌的退出状态为准,或者如果 SHELL-BUILTIN不是一个 "
-"shell 内嵌时\n"
+"    以 SHELL-BUILTIN 内建的退出状态为准,或者如果 SHELL-BUILTIN不是一个 shell 内建时\n"
 "    为假。."
 
 #: builtins.c:365
@@ -2526,26 +2465,19 @@ msgstr ""
 "    果为0。"
 
 #: builtins.c:383
-#, fuzzy
 msgid ""
 "Change the shell working directory.\n"
 "    \n"
-"    Change the current directory to DIR.  The default DIR is the value of "
-"the\n"
+"    Change the current directory to DIR.  The default DIR is the value of the\n"
 "    HOME shell variable.\n"
 "    \n"
-"    The variable CDPATH defines the search path for the directory "
-"containing\n"
-"    DIR.  Alternative directory names in CDPATH are separated by a colon "
-"(:).\n"
-"    A null directory name is the same as the current directory.  If DIR "
-"begins\n"
+"    The variable CDPATH defines the search path for the directory containing\n"
+"    DIR.  Alternative directory names in CDPATH are separated by a colon (:).\n"
+"    A null directory name is the same as the current directory.  If DIR begins\n"
 "    with a slash (/), then CDPATH is not used.\n"
 "    \n"
-"    If the directory is not found, and the shell option `cdable_vars' is "
-"set,\n"
-"    the word is assumed to be  a variable name.  If that variable has a "
-"value,\n"
+"    If the directory is not found, and the shell option `cdable_vars' is set,\n"
+"    the word is assumed to be  a variable name.  If that variable has a value,\n"
 "    its value is used for DIR.\n"
 "    \n"
 "    Options:\n"
@@ -2558,8 +2490,7 @@ msgid ""
 "    The default is to follow symbolic links, as if `-L' were specified.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns 0 if the directory is changed, and if $PWD is set successfully "
-"when\n"
+"    Returns 0 if the directory is changed, and if $PWD is set successfully when\n"
 "    -P is used; non-zero otherwise."
 msgstr ""
 "改变 shell 工作目录。\n"
@@ -2570,7 +2501,7 @@ msgstr ""
 "    变量 CDPATH 定义了含有 DIR 的目录的搜索路径。\n"
 "    CDPATH 变量中不同的目录名称由分号(:)分隔。\n"
 "    一个空的目录名称和当前目录是一样的。如果 DIR 变量由\n"
-"    斜杠 (/) 打头,则 CDPATH 变量不会被使用。\n"
+"    斜杠(/) 打头,则 CDPATH 变量不会被使用。\n"
 "    \n"
 "    如果路径找不到,并且 shell 选项`cdable_vars' 被设定,\n"
 "    则参数词被假定为一个变量名。如果该变量有值,则它的值\n"
@@ -2579,12 +2510,13 @@ msgstr ""
 "    选项:\n"
 "        -L\t强制跟随符号链接。\n"
 "        -P\t使用物理目录结构而不跟随符号链接\n"
-"    \n"
+"        -e\t如果使用了 -P 参数,但不能成功确定当前工作目录时,\n"
+"          \t返回非零的返回值。    \n"
 "    \n"
 "    默认情况下跟随符号链接,如同指定 `-L'。\n"
 "    \n"
 "    退出状态:\n"
-"    如果目录改变返回0,否则非零。"
+"    如果目录改变,或在使用 -P 选项时 $PWD 修改成功时返回0,否则非零。"
 
 #: builtins.c:414
 msgid ""
@@ -2659,8 +2591,7 @@ msgid ""
 "Execute a simple command or display information about commands.\n"
 "    \n"
 "    Runs COMMAND with ARGS suppressing  shell function lookup, or display\n"
-"    information about the specified COMMANDs.  Can be used to invoke "
-"commands\n"
+"    information about the specified COMMANDs.  Can be used to invoke commands\n"
 "    on disk when a function with the same name exists.\n"
 "    \n"
 "    Options:\n"
@@ -2681,7 +2612,7 @@ msgstr ""
 "    选项:\n"
 "      -p\t使用 PATH 变量的一个默认值以确保所有的标准工具\n"
 "    \t都能被找到。\n"
-"      -v\tæ\89\93å\8d° COMMAND å\91½ä»¤ç\9a\84æ\8f\8fè¿°ï¼\8cå\92\8c `type' å\86\85åµ\8c相似\n"
+"      -v\tæ\89\93å\8d° COMMAND å\91½ä»¤ç\9a\84æ\8f\8fè¿°ï¼\8cå\92\8c `type' å\86\85建相似\n"
 "      -V\t打印每个 COMMAND 命令的详细描述\n"
 "    \n"
 "    退出状态\n"
@@ -2718,8 +2649,7 @@ msgid ""
 "    Variables with the integer attribute have arithmetic evaluation (see\n"
 "    the `let' command) performed when the variable is assigned a value.\n"
 "    \n"
-"    When used in a function, `declare' makes NAMEs local, as with the "
-"`local'\n"
+"    When used in a function, `declare' makes NAMEs local, as with the `local'\n"
 "    command.  The `-g' option suppresses this behavior.\n"
 "    \n"
 "    Exit Status:\n"
@@ -2732,24 +2662,24 @@ msgstr ""
 "    \n"
 "    选项:\n"
 "      -f\t限制动作或显示函数名称和定义\n"
-"      -F\t限制仅显示函数名称以及行号和调试时\n"
-"    \t源文件名\n"
+"      -F\t限制仅显示函数名称(以及行号和调试时\n"
+"    \t源文件名)\n"
 "      -p\t显示每个 NAME 变量的属性和值\n"
 "    \n"
 "    设定属性的选项:\n"
-"      -a\t使 NAME 成为下标数组(如果支持)\n"
-"      -A\t使 NAME 成为关联数组 (如果支持)\n"
-"      -i\t使 NAME 带有 `integer' (整数)属性\n"
+"      -a\t使 NAME 成为下标数组(如果支持)\n"
+"      -A\t使 NAME 成为关联数组 (如果支持)\n"
+"      -i\t使 NAME 带有 `integer' (整数)属性\n"
 "      -l\t将 NAME 在赋值时转为小写\n"
 "      -r\t将 NAME 变为只读\n"
-"      -t\t使 NAME 带有 `trace' (追踪)属性\n"
+"      -t\t使 NAME 带有 `trace' (追踪)属性\n"
 "      -u\t将 NAME 在赋值时转为大写\n"
 "      -x\t将 NAME 导出\n"
 "    \n"
 "    用 `+' 代替 `-' 会关闭指定选项。\n"
 "    \n"
-"    带有整数属性的变量在赋值时将使用算术估值见\n"
-"    `let' 命令\n"
+"    带有整数属性的变量在赋值时将使用算术估值(见\n"
+"    `let' 命令)\n"
 "    \n"
 "    在函数中使用时,`declare' 使 NAME 成为本地变量,和 `local'\n"
 "    命令一致。\n"
@@ -2833,7 +2763,7 @@ msgstr ""
 "      -E\t显式地抑制对于反斜杠转义的解释\n"
 "    \n"
 "    `echo' 对下列反斜杠字符进行转义:\n"
-"      \\a\t警告(响铃)\n"
+"      \\a\t警告(响铃)\n"
 "      \\b\t退格\n"
 "      \\c\t抑制更多的输出\n"
 "      \\e\t转义字符\n"
@@ -2843,9 +2773,9 @@ msgstr ""
 "      \\t\t横向制表符\n"
 "      \\v\t纵向制表符\n"
 "      \\\\\t反斜杠\n"
-"      \\0nnn\t以 NNN (八进制)为 ASCII 码的字符。 NNN 可以是\n"
+"      \\0nnn\t以 NNN (八进制)为 ASCII 码的字符。 NNN 可以是\n"
 "    \t0到3个八进制数字\n"
-"      \\xHH\t以 HH (十六进制)为值的八比特字符。HH可以是\n"
+"      \\xHH\t以 HH (十六进制)为值的八比特字符。HH可以是\n"
 "    \t一个或两个十六进制数字\n"
 "    \n"
 "    退出状态:\n"
@@ -2899,36 +2829,35 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless NAME is not a shell builtin or an error occurs."
 msgstr ""
-"å\90¯ç\94¨å\92\8cç¦\81ç\94¨ shell å\86\85åµ\8c。\n"
+"å\90¯ç\94¨å\92\8cç¦\81ç\94¨ shell å\86\85建。\n"
 "    \n"
-"    å\90¯ç\94¨å\92\8cç¦\81ç\94¨ shell ç\9a\84å\86\85åµ\8cå\91½ä»¤ã\80\82ç¦\81ç\94¨ä½¿æ\82¨è\83½å¤\9fæ\89§è¡\8cä¸\80个å\92\8cå\86\85åµ\8c\n"
+"    å\90¯ç\94¨å\92\8cç¦\81ç\94¨ shell ç\9a\84å\86\85建å\91½ä»¤ã\80\82ç¦\81ç\94¨ä½¿æ\82¨è\83½å¤\9fæ\89§è¡\8cä¸\80个å\92\8cå\86\85建\n"
 "    命令同名的磁盘上的命令,而无须使用完整的路径名。\n"
 "    \n"
 "    \n"
 "    选项:\n"
-"      -a\tæ\89\93å\8d°ä¸\80个å\86\85åµ\8c的列表,并显示其中每一个是否启用\n"
-"      -n\tç¦\81ç\94¨æ¯\8fä¸\80个 NAME å\86\85åµ\8cæ\88\96è\80\85æ\98¾ç¤ºä¸\80个被ç¦\81ç\94¨ç\9a\84å\86\85åµ\8c的列表\n"
-"      -p\t以å\8f¯é\87\8dç\94¨ç\9a\84æ ¼å¼\8fæ\89\93å\8d°ä¸\80个å\86\85åµ\8c的列表\n"
-"      -s\tä»\85æ\89\93å\8d°Posix `special'  å\86\85åµ\8c的名称\n"
+"      -a\tæ\89\93å\8d°ä¸\80个å\86\85建的列表,并显示其中每一个是否启用\n"
+"      -n\tç¦\81ç\94¨æ¯\8fä¸\80个 NAME å\86\85建æ\88\96è\80\85æ\98¾ç¤ºä¸\80个被ç¦\81ç\94¨ç\9a\84å\86\85建的列表\n"
+"      -p\t以å\8f¯é\87\8dç\94¨ç\9a\84æ ¼å¼\8fæ\89\93å\8d°ä¸\80个å\86\85建的列表\n"
+"      -s\tä»\85æ\89\93å\8d°Posix `special'  å\86\85建的名称\n"
 "    \n"
 "    控制动态加载的选项:\n"
-"      -f\tä»\8eå\85±äº«å¯¹è±¡ FILENAME æ\96\87件中å\8a è½½ NAME å\86\85åµ\8c\n"
-"      -d\tå\88 é\99¤ä»¥ -f é\80\89项å\8a è½½ç\9a\84å\86\85åµ\8c\n"
+"      -f\tä»\8eå\85±äº«å¯¹è±¡ FILENAME æ\96\87件中å\8a è½½ NAME å\86\85建\n"
+"      -d\tå\88 é\99¤ä»¥ -f é\80\89项å\8a è½½ç\9a\84å\86\85建\n"
 "    \n"
-"    ä¸\8d带é\80\89项æ\97¶ï¼\8cæ¯\8fä¸\80个 NAME å\86\85åµ\8c都被启用。\n"
+"    ä¸\8d带é\80\89项æ\97¶ï¼\8cæ¯\8fä¸\80个 NAME å\86\85建都被启用。\n"
 "    \n"
-"    å¦\82æ\9e\9cè¦\81使ç\94¨ $PATH ä¸­æ\89¾å\88°ç\9a\84 `test' è\80\8cä¸\8dæ\98¯ shell å\86\85åµ\8c的版本,\n"
+"    å¦\82æ\9e\9cè¦\81使ç\94¨ $PATH ä¸­æ\89¾å\88°ç\9a\84 `test' è\80\8cä¸\8dæ\98¯ shell å\86\85建的版本,\n"
 "    输入 `enable -n test'。\n"
 "    \n"
 "    退出状态:\n"
-"    è¿\94å\9b\9eæ\88\90å\8a\9fï¼\8cé\99¤é\9d\9e NAME ä¸\8dæ\98¯ä¸\80个 shell å\86\85åµ\8c或者有错误发生。"
+"    è¿\94å\9b\9eæ\88\90å\8a\9fï¼\8cé\99¤é\9d\9e NAME ä¸\8dæ\98¯ä¸\80个 shell å\86\85建或者有错误发生。"
 
 #: builtins.c:619
 msgid ""
 "Execute arguments as a shell command.\n"
 "    \n"
-"    Combine ARGs into a single string, use the result as input to the "
-"shell,\n"
+"    Combine ARGs into a single string, use the result as input to the shell,\n"
 "    and execute the resulting commands.\n"
 "    \n"
 "    Exit Status:\n"
@@ -2988,7 +2917,7 @@ msgstr ""
 "    \n"
 "    \n"
 "    OPTSTRING 字符串包含待识别的选项字母;如果一个字母后面跟\n"
-"    着分号,则该选项期待一个参数,而该参数应用空格与选项分开。\n"
+"    着分号,则该选项需要一个参数,而该参数应用空格与选项分开。\n"
 "    \n"
 "    \n"
 "    每次启动时,getopts 会将下一个选项放到 shell 变量 $name\n"
@@ -3005,15 +2934,15 @@ msgstr ""
 "    须的选项没有找到,getopts 放一个 ':' 到 NAME 变量中并且设\n"
 "    置 OPTARG 变量为找到的选项字符。如果 getopts 不在沉默模\n"
 "    式中,并且遇到了一个无效的选项,getopts 放置一个 '?' 到 NAME \n"
-"    å\8f\98é\87\8f中并ä¸\94å\8f\8d设定 OPTARG变量。如果必须的选项没有找到,\n"
-"    ä¸\80个'?'ä¼\9a被æ\94¾å\85¥ NAMEå\8f\98é\87\8f中ï¼\8cOPTARG å°\86被å\8f\8d设定,并且会\n"
+"    å\8f\98é\87\8f中并ä¸\94å\8f\96æ¶\88设定 OPTARG变量。如果必须的选项没有找到,\n"
+"    ä¸\80个'?'ä¼\9a被æ\94¾å\85¥ NAMEå\8f\98é\87\8f中ï¼\8cOPTARG å°\86被å\8f\96æ¶\88设定,并且会\n"
 "    打印一个诊断信息。\n"
 "    \n"
 "    如果 shell 变量 OPTERR 的值为0,getopts 禁用\n"
 "    错误信息的打印,即使 OPTSTRING 变量的第一个字符不是一\n"
 "    个冒号。OPTERR 的默认值为1.\n"
 "    \n"
-"    Getopts 通常解析可定位的参数($0 - $9),不过如果提供了\n"
+"    Getopts 通常解析可定位的参数($0 - $9),不过如果提供了\n"
 "    更多的参数,它们反而会被解析。\n"
 "    \n"
 "    退出状态:\n"
@@ -3025,8 +2954,7 @@ msgid ""
 "Replace the shell with the given command.\n"
 "    \n"
 "    Execute COMMAND, replacing this shell with the specified program.\n"
-"    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not "
-"specified,\n"
+"    ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,\n"
 "    any redirections take effect in the current shell.\n"
 "    \n"
 "    Options:\n"
@@ -3034,13 +2962,11 @@ msgid ""
 "      -c\t\texecute COMMAND with an empty environment\n"
 "      -l\t\tplace a dash in the zeroth argument to COMMAND\n"
 "    \n"
-"    If the command cannot be executed, a non-interactive shell exits, "
-"unless\n"
+"    If the command cannot be executed, a non-interactive shell exits, unless\n"
 "    the shell option `execfail' is set.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless COMMAND is not found or a redirection error "
-"occurs."
+"    Returns success unless COMMAND is not found or a redirection error occurs."
 msgstr ""
 "使用指定命令替换 shell。\n"
 "    \n"
@@ -3075,8 +3001,7 @@ msgstr ""
 msgid ""
 "Exit a login shell.\n"
 "    \n"
-"    Exits a login shell with exit status N.  Returns an error if not "
-"executed\n"
+"    Exits a login shell with exit status N.  Returns an error if not executed\n"
 "    in a login shell."
 msgstr ""
 "退出一个登录 shell.\n"
@@ -3088,15 +3013,13 @@ msgstr ""
 msgid ""
 "Display or execute commands from the history list.\n"
 "    \n"
-"    fc is used to list or edit and re-execute commands from the history "
-"list.\n"
+"    fc is used to list or edit and re-execute commands from the history list.\n"
 "    FIRST and LAST can be numbers specifying the range, or FIRST can be a\n"
 "    string, which means the most recent command beginning with that\n"
 "    string.\n"
 "    \n"
 "    Options:\n"
-"      -e ENAME\tselect which editor to use.  Default is FCEDIT, then "
-"EDITOR,\n"
+"      -e ENAME\tselect which editor to use.  Default is FCEDIT, then EDITOR,\n"
 "    \t\tthen vi\n"
 "      -l \tlist lines instead of editing\n"
 "      -n\tomit line numbers when listing\n"
@@ -3110,8 +3033,7 @@ msgid ""
 "    the last command.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success or status of executed command; non-zero if an error "
-"occurs."
+"    Returns success or status of executed command; non-zero if an error occurs."
 msgstr ""
 "从历史列表中显示或者执行命令。\n"
 "    \n"
@@ -3125,7 +3047,7 @@ msgstr ""
 "    \t\t然后是 vi\n"
 "      -l \t列出行而不编辑\n"
 "      -n\t列举时省略行号\n"
-"      -r\t反转行的顺序(最新行在前)\n"
+"      -r\t反转行的顺序(最新行在前)\n"
 "    \n"
 "    用 `fc -s [模式=替换 ...] [命令]' 的格式,COMMAND 命令会在 OLD=NEW\n"
 "    替换之后被重新执行。\n"
@@ -3161,10 +3083,8 @@ msgstr ""
 msgid ""
 "Move jobs to the background.\n"
 "    \n"
-"    Place the jobs identified by each JOB_SPEC in the background, as if "
-"they\n"
-"    had been started with `&'.  If JOB_SPEC is not present, the shell's "
-"notion\n"
+"    Place the jobs identified by each JOB_SPEC in the background, as if they\n"
+"    had been started with `&'.  If JOB_SPEC is not present, the shell's notion\n"
 "    of the current job is used.\n"
 "    \n"
 "    Exit Status:\n"
@@ -3184,8 +3104,7 @@ msgid ""
 "Remember or display program locations.\n"
 "    \n"
 "    Determine and remember the full pathname of each command NAME.  If\n"
-"    no arguments are given, information about remembered commands is "
-"displayed.\n"
+"    no arguments are given, information about remembered commands is displayed.\n"
 "    \n"
 "    Options:\n"
 "      -d\t\tforget the remembered location of each NAME\n"
@@ -3240,12 +3159,11 @@ msgid ""
 "      PATTERN\tPattern specifiying a help topic\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless PATTERN is not found or an invalid option is "
-"given."
+"    Returns success unless PATTERN is not found or an invalid option is given."
 msgstr ""
-"æ\98¾ç¤ºå\86\85åµ\8c命令的相关信息。\n"
+"æ\98¾ç¤ºå\86\85建命令的相关信息。\n"
 "    \n"
-"    æ\98¾ç¤ºå\86\85åµ\8c命令的简略信息。如果指定了 PATTERN 模式,\n"
+"    æ\98¾ç¤ºå\86\85建命令的简略信息。如果指定了 PATTERN 模式,\n"
 "    给出所有匹配 PATTERN 模式的命令的详细帮助,否则打\n"
 "    印一个帮助主题列表\n"
 "    \n"
@@ -3288,8 +3206,7 @@ msgid ""
 "    \n"
 "    If the $HISTTIMEFORMAT variable is set and not null, its value is used\n"
 "    as a format string for strftime(3) to print the time stamp associated\n"
-"    with each displayed history entry.  No time stamps are printed "
-"otherwise.\n"
+"    with each displayed history entry.  No time stamps are printed otherwise.\n"
 "    \n"
 "    Exit Status:\n"
 "    Returns success unless an invalid option is given or an error occurs."
@@ -3429,7 +3346,7 @@ msgstr ""
 "      -l\t列出信号名称;如果参数后跟 `-l'则被假设为信号编号,\n"
 "    \t而相应的信号名称会被列出\n"
 "    \n"
-"    Kill æ\88\90为 shell å\86\85åµ\8c有两个理由:它允许使用任务编号而不是进程号,\n"
+"    Kill æ\88\90为 shell å\86\85建有两个理由:它允许使用任务编号而不是进程号,\n"
 "    并且在可以创建的进程数上限达到是允许进程被杀死。\n"
 "    \n"
 "    退出状态:\n"
@@ -3443,8 +3360,7 @@ msgid ""
 "    Evaluate each ARG as an arithmetic expression.  Evaluation is done in\n"
 "    fixed-width integers with no check for overflow, though division by 0\n"
 "    is trapped and flagged as an error.  The following list of operators is\n"
-"    grouped into levels of equal-precedence operators.  The levels are "
-"listed\n"
+"    grouped into levels of equal-precedence operators.  The levels are listed\n"
 "    in order of decreasing precedence.\n"
 "    \n"
 "    \tid++, id--\tvariable post-increment, post-decrement\n"
@@ -3510,7 +3426,7 @@ msgstr ""
 "    \t&=, ^=, |=\t赋值\n"
 "    \n"
 "    Shell 变量允许作为操作数。表达式中的变量的名称会被取代\n"
-"    以值(强制转换为等宽的整数)。表达式中的变量不需要打开\n"
+"    以值(强制转换为等宽的整数)。表达式中的变量不需要打开\n"
 "    整数属性。\n"
 "    \n"
 "    \n"
@@ -3526,16 +3442,13 @@ msgid ""
 "Read a line from the standard input and split it into fields.\n"
 "    \n"
 "    Reads a single line from the standard input, or from file descriptor FD\n"
-"    if the -u option is supplied.  The line is split into fields as with "
-"word\n"
+"    if the -u option is supplied.  The line is split into fields as with word\n"
 "    splitting, and the first word is assigned to the first NAME, the second\n"
 "    word to the second NAME, and so on, with any leftover words assigned to\n"
-"    the last NAME.  Only the characters found in $IFS are recognized as "
-"word\n"
+"    the last NAME.  Only the characters found in $IFS are recognized as word\n"
 "    delimiters.\n"
 "    \n"
-"    If no NAMEs are supplied, the line read is stored in the REPLY "
-"variable.\n"
+"    If no NAMEs are supplied, the line read is stored in the REPLY variable.\n"
 "    \n"
 "    Options:\n"
 "      -a array\tassign the words read to sequential indices of the array\n"
@@ -3547,15 +3460,13 @@ msgid ""
 "      -n nchars\treturn after reading NCHARS characters rather than waiting\n"
 "    \t\tfor a newline, but honor a delimiter if fewer than NCHARS\n"
 "    \t\tcharacters are read before the delimiter\n"
-"      -N nchars\treturn only after reading exactly NCHARS characters, "
-"unless\n"
+"      -N nchars\treturn only after reading exactly NCHARS characters, unless\n"
 "    \t\tEOF is encountered or read times out, ignoring any delimiter\n"
 "      -p prompt\toutput the string PROMPT without a trailing newline before\n"
 "    \t\tattempting to read\n"
 "      -r\t\tdo not allow backslashes to escape any characters\n"
 "      -s\t\tdo not echo input coming from a terminal\n"
-"      -t timeout\ttime out and return failure if a complete line of input "
-"is\n"
+"      -t timeout\ttime out and return failure if a complete line of input is\n"
 "    \t\tnot read withint TIMEOUT seconds.  The value of the TMOUT\n"
 "    \t\tvariable is the default timeout.  TIMEOUT may be a\n"
 "    \t\tfractional number.  If TIMEOUT is 0, read returns success only\n"
@@ -3564,8 +3475,7 @@ msgid ""
 "      -u fd\t\tread from file descriptor FD instead of the standard input\n"
 "    \n"
 "    Exit Status:\n"
-"    The return code is zero, unless end-of-file is encountered, read times "
-"out,\n"
+"    The return code is zero, unless end-of-file is encountered, read times out,\n"
 "    or an invalid file descriptor is supplied as the argument to -u."
 msgstr ""
 "从标准输入读取一行并将其分为不同的域。\n"
@@ -3669,8 +3579,7 @@ msgid ""
 "              physical     same as -P\n"
 "              pipefail     the return value of a pipeline is the status of\n"
 "                           the last command to exit with a non-zero status,\n"
-"                           or zero if no command exited with a non-zero "
-"status\n"
+"                           or zero if no command exited with a non-zero status\n"
 "              posix        change the behavior of bash where the default\n"
 "                           operation differs from the Posix standard to\n"
 "                           match the standard\n"
@@ -3710,7 +3619,7 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option is given."
 msgstr ""
-"设å®\9aæ\88\96å\8f\8d设定 shell 选项和位置参数的值。\n"
+"设å®\9aæ\88\96å\8f\96æ¶\88设定 shell 选项和位置参数的值。\n"
 "    \n"
 "    改变 shell 选项和位置参数的值,或者显示 shell 变量的\n"
 "    名称和值。\n"
@@ -3719,7 +3628,7 @@ msgstr ""
 "      -a  标记修改的或者创建的变量为导出。\n"
 "      -b  立即通告任务终结。\n"
 "      -e  如果一个命令以非零状态退出,则立即退出。\n"
-"      -f  禁用文件名生成(模式匹配)。\n"
+"      -f  禁用文件名生成(模式匹配)。\n"
 "      -h  当查询命令时记住它们的位置\n"
 "      -k  所有的赋值参数被放在命令的环境中,而不仅仅是\n"
 "          命令名称之前的参数。\n"
@@ -3796,8 +3705,7 @@ msgid ""
 "      -f\ttreat each NAME as a shell function\n"
 "      -v\ttreat each NAME as a shell variable\n"
 "    \n"
-"    Without options, unset first tries to unset a variable, and if that "
-"fails,\n"
+"    Without options, unset first tries to unset a variable, and if that fails,\n"
 "    tries to unset a function.\n"
 "    \n"
 "    Some variables cannot be unset; also see `readonly'.\n"
@@ -3805,7 +3713,7 @@ msgid ""
 "    Exit Status:\n"
 "    Returns success unless an invalid option is given or a NAME is read-only."
 msgstr ""
-"å\8f\8d设定 shell 变量和函数的值和属性。\n"
+"å\8f\96æ¶\88设定 shell 变量和函数的值和属性。\n"
 "    \n"
 "    对每一个 NAME 名称,删除对应的变量或函数。\n"
 "    \n"
@@ -3813,10 +3721,10 @@ msgstr ""
 "      -f\t将每个 NAME 名称当作函数对待\n"
 "      -v\t将每个 NAME 名称当作变量对待\n"
 "    \n"
-"    ä¸\8d带é\80\89项æ\97¶ï¼\8cunset é¦\96å\85\88å°\9dè¯\95å\8f\8d设定一个变量,如果\n"
-"    å¤±è´¥ï¼\8cå\86\8då°\9dè¯\95å\8f\8d设定一个函数。\n"
+"    ä¸\8d带é\80\89项æ\97¶ï¼\8cunset é¦\96å\85\88å°\9dè¯\95å\8f\96æ¶\88设定一个变量,如果\n"
+"    å¤±è´¥ï¼\8cå\86\8då°\9dè¯\95å\8f\96æ¶\88设定一个函数。\n"
 "    \n"
-"    æ\9f\90äº\9bå\8f\98é\87\8fä¸\8då\8f¯ä»¥è¢«å\8f\8d设定;请查看 `readonly'。\n"
+"    æ\9f\90äº\9bå\8f\98é\87\8fä¸\8då\8f¯ä»¥è¢«å\8f\96æ¶\88设定;请查看 `readonly'。\n"
 "    \n"
 "    退出状态:\n"
 "    返回成功,除非使用了无效的选项或者 NAME 名称为只读。"
@@ -3826,8 +3734,7 @@ msgid ""
 "Set export attribute for shell variables.\n"
 "    \n"
 "    Marks each NAME for automatic export to the environment of subsequently\n"
-"    executed commands.  If VALUE is supplied, assign VALUE before "
-"exporting.\n"
+"    executed commands.  If VALUE is supplied, assign VALUE before exporting.\n"
 "    \n"
 "    Options:\n"
 "      -f\trefer to shell functions\n"
@@ -3988,8 +3895,7 @@ msgid ""
 "      -x FILE        True if the file is executable by you.\n"
 "      -O FILE        True if the file is effectively owned by you.\n"
 "      -G FILE        True if the file is effectively owned by your group.\n"
-"      -N FILE        True if the file has been modified since it was last "
-"read.\n"
+"      -N FILE        True if the file has been modified since it was last read.\n"
 "    \n"
 "      FILE1 -nt FILE2  True if file1 is newer than file2 (according to\n"
 "                       modification date).\n"
@@ -4010,8 +3916,7 @@ msgid ""
 "      STRING1 != STRING2\n"
 "                     True if the strings are not equal.\n"
 "      STRING1 < STRING2\n"
-"                     True if STRING1 sorts before STRING2 "
-"lexicographically.\n"
+"                     True if STRING1 sorts before STRING2 lexicographically.\n"
 "      STRING1 > STRING2\n"
 "                     True if STRING1 sorts after STRING2 lexicographically.\n"
 "    \n"
@@ -4036,7 +3941,7 @@ msgid ""
 msgstr ""
 "对条件表达式进行估值。\n"
 "    \n"
-"    根据 EXPR 表达式的估值以状态0(真)或1(伪)退出。\n"
+"    根据 EXPR 表达式的估值以状态0(真)或1(伪)退出。\n"
 "    表达式可以是一元或者二元的。一元表达式通常用于检测\n"
 "    文件状态。同时还有字符串操作符和数字比较操作符。\n"
 "    \n"
@@ -4064,8 +3969,8 @@ msgstr ""
 "      -G 文件        如果文件被您的组所有则为真。\n"
 "      -N 文件        如果文件上次被读取之后修改过则为真。\n"
 "    \n"
-"      FILE1 -nt FILE2  如果 file1 文件新于 file2 文件则为真根据\n"
-"                       修改日期。\n"
+"      FILE1 -nt FILE2  如果 file1 文件新于 file2 文件则为真(根据\n"
+"                       修改日期)。\n"
 "    \n"
 "      FILE1 -ot FILE2  如果 file1 文件旧于 file2 文件则为真。\n"
 "    \n"
@@ -4113,15 +4018,14 @@ msgid ""
 msgstr ""
 "估值条件表达式。\n"
 "    \n"
-"    æ\98¯å\86\85åµ\8c命令 \"test\" 的同义词,但是最后一个参数必须是\n"
+"    æ\98¯å\86\85建命令 \"test\" 的同义词,但是最后一个参数必须是\n"
 "    字符 `]',以匹配起始的 `['。"
 
 #: builtins.c:1320
 msgid ""
 "Display process times.\n"
 "    \n"
-"    Prints the accumulated user and system times for the shell and all of "
-"its\n"
+"    Prints the accumulated user and system times for the shell and all of its\n"
 "    child processes.\n"
 "    \n"
 "    Exit Status:\n"
@@ -4140,8 +4044,7 @@ msgstr ""
 msgid ""
 "Trap signals and other events.\n"
 "    \n"
-"    Defines and activates handlers to be run when the shell receives "
-"signals\n"
+"    Defines and activates handlers to be run when the shell receives signals\n"
 "    or other conditions.\n"
 "    \n"
 "    ARG is a command to be read and executed when the shell receives the\n"
@@ -4150,41 +4053,33 @@ msgid ""
 "    value.  If ARG is the null string each SIGNAL_SPEC is ignored by the\n"
 "    shell and by the commands it invokes.\n"
 "    \n"
-"    If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell.  "
-"If\n"
-"    a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command.  "
-"If\n"
-"    a SIGNAL_SPEC is RETURN, ARG is executed each time a shell function or "
-"a\n"
-"    script run by the . or source builtins finishes executing.  A "
-"SIGNAL_SPEC\n"
-"    of ERR means to execute ARG each time a command's failure would cause "
-"the\n"
+"    If a SIGNAL_SPEC is EXIT (0) ARG is executed on exit from the shell.  If\n"
+"    a SIGNAL_SPEC is DEBUG, ARG is executed before every simple command.  If\n"
+"    a SIGNAL_SPEC is RETURN, ARG is executed each time a shell function or a\n"
+"    script run by the . or source builtins finishes executing.  A SIGNAL_SPEC\n"
+"    of ERR means to execute ARG each time a command's failure would cause the\n"
 "    shell to exit when the -e option is enabled.\n"
 "    \n"
-"    If no arguments are supplied, trap prints the list of commands "
-"associated\n"
+"    If no arguments are supplied, trap prints the list of commands associated\n"
 "    with each signal.\n"
 "    \n"
 "    Options:\n"
 "      -l\tprint a list of signal names and their corresponding numbers\n"
 "      -p\tdisplay the trap commands associated with each SIGNAL_SPEC\n"
 "    \n"
-"    Each SIGNAL_SPEC is either a signal name in <signal.h> or a signal "
-"number.\n"
+"    Each SIGNAL_SPEC is either a signal name in <signal.h> or a signal number.\n"
 "    Signal names are case insensitive and the SIG prefix is optional.  A\n"
 "    signal may be sent to the shell with \"kill -signal $$\".\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless a SIGSPEC is invalid or an invalid option is "
-"given."
+"    Returns success unless a SIGSPEC is invalid or an invalid option is given."
 msgstr ""
 "对信号和其他事件设陷阱。\n"
 "    \n"
 "    定义一个处理器,在 shell 接收到信号和其他条件下执行。\n"
 "    \n"
 "    ARG 参数是当 shell 接收到 SIGNAL_SPEC 信号时读取和执行的命令。\n"
-"    如果没有指定 ARG 参数(并且只给出一个 SIGNAL_SPEC 信号)或者\n"
+"    如果没有指定 ARG 参数(并且只给出一个 SIGNAL_SPEC 信号)或者\n"
 "    或者 ARG 参数为 `-',每一个指定的参数会被重置为原始值。如果 ARG 参数\n"
 "    是一个空串,则每一个 SIGNAL_SPEC 信号会被 shell 和它启动的命令忽略。\n"
 "    \n"
@@ -4232,8 +4127,7 @@ msgid ""
 "      NAME\tCommand name to be interpreted.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success if all of the NAMEs are found; fails if any are not "
-"found."
+"    Returns success if all of the NAMEs are found; fails if any are not found."
 msgstr ""
 "显示命令类型的信息。\n"
 "    \n"
@@ -4241,15 +4135,15 @@ msgstr ""
 "    \n"
 "    选项:\n"
 "      -a\t显示所有包含名称为 NAME 的可执行文件的位置;\n"
-"    \tå\8c\85æ\8b¬å\88«å\90\8dã\80\81å\86\85åµ\8c和函数。仅当 `-p' 选项没有使用时\n"
+"    \tå\8c\85æ\8b¬å\88«å\90\8dã\80\81å\86\85建和函数。仅当 `-p' 选项没有使用时\n"
 "      -f\t抑制 shell 函数查询\n"
 "      -P\t为每个 NAME 名称惊醒 PATH 路径搜索,即使它是别名、\n"
-"    \tå\86\85åµ\8c或函数,并且返回将被执行的磁盘上文件的名称。\n"
+"    \tå\86\85建或函数,并且返回将被执行的磁盘上文件的名称。\n"
 "      -p\t返回将被执行的磁盘上文件的名称,或者当 `type -t NAME'\n"
 "    \t不返回 `file' 时,不返回任何值。\n"
 "      -t\t返回下列词中的任何一个`alias'、`keyword'、\n"
 "    \t`function'、`builtin'、`file'或者`',如果 NAME 是相应的\n"
-"    \tä¸\80个å\88«å\90\8dã\80\81shell ä¿\9dç\95\99å­\97ã\80\81shell å\87½æ\95°ã\80\81shell å\86\85åµ\8c、\n"
+"    \tä¸\80个å\88«å\90\8dã\80\81shell ä¿\9dç\95\99å­\97ã\80\81shell å\87½æ\95°ã\80\81shell å\86\85建、\n"
 "    \t磁盘文件或没有找到。\n"
 "    \n"
 "    参数:\n"
@@ -4262,8 +4156,7 @@ msgstr ""
 msgid ""
 "Modify shell resource limits.\n"
 "    \n"
-"    Provides control over the resources available to the shell and "
-"processes\n"
+"    Provides control over the resources available to the shell and processes\n"
 "    it creates, on systems that allow such control.\n"
 "    \n"
 "    Options:\n"
@@ -4307,13 +4200,13 @@ msgstr ""
 "    资源的控制。\n"
 "    \n"
 "    选项:\n"
-"      -S\t使用 `soft'(软)资源限制\n"
-"      -H\t使用 `hard'(硬)资源限制\n"
+"      -S\t使用 `soft'(软)资源限制\n"
+"      -H\t使用 `hard'(硬)资源限制\n"
 "      -a\t所有当前限制都被报告\n"
 "      -b\t套接字缓存尺寸\n"
 "      -c\t创建的核文件的最大尺寸\n"
 "      -d\t一个进程的数据区的最大尺寸\n"
-"      -e\t最高的调度优先级(`nice')\n"
+"      -e\t最高的调度优先级(`nice')\n"
 "      -f\t有 shell 及其子进程可以写的最大文件尺寸\n"
 "      -i\t最多的可以挂起的信号数\n"
 "      -l\t一个进程可以锁定的最大内存尺寸\n"
@@ -4377,13 +4270,11 @@ msgid ""
 "    Waits for the process identified by ID, which may be a process ID or a\n"
 "    job specification, and reports its termination status.  If ID is not\n"
 "    given, waits for all currently active child processes, and the return\n"
-"    status is zero.  If ID is a a job specification, waits for all "
-"processes\n"
+"    status is zero.  If ID is a a job specification, waits for all processes\n"
 "    in the job's pipeline.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns the status of ID; fails if ID is invalid or an invalid option "
-"is\n"
+"    Returns the status of ID; fails if ID is invalid or an invalid option is\n"
 "    given."
 msgstr ""
 "等待任务完成并返回退出状态。\n"
@@ -4405,8 +4296,7 @@ msgid ""
 "    and the return code is zero.  PID must be a process ID.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns the status of ID; fails if ID is invalid or an invalid option "
-"is\n"
+"    Returns the status of ID; fails if ID is invalid or an invalid option is\n"
 "    given."
 msgstr ""
 "等待进程完成并且返回退出状态。\n"
@@ -4553,17 +4443,12 @@ msgstr ""
 msgid ""
 "Execute commands based on conditional.\n"
 "    \n"
-"    The `if COMMANDS' list is executed.  If its exit status is zero, then "
-"the\n"
-"    `then COMMANDS' list is executed.  Otherwise, each `elif COMMANDS' list "
-"is\n"
+"    The `if COMMANDS' list is executed.  If its exit status is zero, then the\n"
+"    `then COMMANDS' list is executed.  Otherwise, each `elif COMMANDS' list is\n"
 "    executed in turn, and if its exit status is zero, the corresponding\n"
-"    `then COMMANDS' list is executed and the if command completes.  "
-"Otherwise,\n"
-"    the `else COMMANDS' list is executed, if present.  The exit status of "
-"the\n"
-"    entire construct is the exit status of the last command executed, or "
-"zero\n"
+"    `then COMMANDS' list is executed and the if command completes.  Otherwise,\n"
+"    the `else COMMANDS' list is executed, if present.  The exit status of the\n"
+"    entire construct is the exit status of the last command executed, or zero\n"
 "    if no condition tested true.\n"
 "    \n"
 "    Exit Status:\n"
@@ -4643,8 +4528,7 @@ msgid ""
 "Define shell function.\n"
 "    \n"
 "    Create a shell function named NAME.  When invoked as a simple command,\n"
-"    NAME runs COMMANDs in the calling shell's context.  When NAME is "
-"invoked,\n"
+"    NAME runs COMMANDs in the calling shell's context.  When NAME is invoked,\n"
 "    the arguments are passed to the function as $1...$n, and the function's\n"
 "    name is in $FUNCNAME.\n"
 "    \n"
@@ -4725,12 +4609,9 @@ msgstr ""
 msgid ""
 "Execute conditional command.\n"
 "    \n"
-"    Returns a status of 0 or 1 depending on the evaluation of the "
-"conditional\n"
-"    expression EXPRESSION.  Expressions are composed of the same primaries "
-"used\n"
-"    by the `test' builtin, and may be combined using the following "
-"operators:\n"
+"    Returns a status of 0 or 1 depending on the evaluation of the conditional\n"
+"    expression EXPRESSION.  Expressions are composed of the same primaries used\n"
+"    by the `test' builtin, and may be combined using the following operators:\n"
 "    \n"
 "      ( EXPRESSION )\tReturns the value of EXPRESSION\n"
 "      ! EXPRESSION\t\tTrue if EXPRESSION is false; else false\n"
@@ -4751,13 +4632,12 @@ msgstr ""
 "执行条件命令。\n"
 "    \n"
 "    根据条件表达式 EXPRESSION 的估值返回状态0或1。表达式按照\n"
-"    `test' å\86\85åµ\8c的相同条件组成,或者可以有下列操作符连接而成:\n"
+"    `test' å\86\85建的相同条件组成,或者可以有下列操作符连接而成:\n"
 "    \n"
 "      ( EXPRESSION )\t返回 EXPRESSION 表达式的值\n"
 "      ! EXPRESSION\t\t如果 EXPRESSION表达式为假则为真,否则为假\n"
 "      EXPR1 && EXPR2\t如果 EXPR1 和 EXPR2 表达式均为真则为真,否则为假\n"
-"      EXPR1 || EXPR2\t如果 EXPR1 和 EXPR2 表达式中有一个为真则为真,否则为"
-"假\n"
+"      EXPR1 || EXPR2\t如果 EXPR1 和 EXPR2 表达式中有一个为真则为真,否则为假\n"
 "    \n"
 "    当使用 `==' 和 `!=' 操作符时,操作符右边的字符串被用作模式并且执行一个\n"
 "    匹配。当使用 `=~' 操作符时,操作符右边的字符串被当作正则表达式来进行\n"
@@ -4836,7 +4716,7 @@ msgstr ""
 "    HOSTTYPE\t当前版本的 BASH 在其之上运行的 CPU 类型。\n"
 "    IGNOREEOF\t控制 shell 收到文件结束符作为单一输入后的\n"
 "    \t\t动作。如果设定这个变量,则它的值是 shell 退出之前在\n"
-"    \t\t一个空行上可以连续看到的文件结束符数量(默认为10)。\n"
+"    \t\t一个空行上可以连续看到的文件结束符数量(默认为10)。\n"
 "    \t\t未设定时,文件结束符标志着输入的结束。\n"
 "    MACHTYPE\t描述当前运行 Bash 的系统的字符串。\n"
 "    MAILCHECK\tBash 检测新邮件的频率,以秒为单位。\n"
@@ -4904,15 +4784,15 @@ msgstr ""
 "    \t进行操作。\n"
 "    \n"
 "    参数:\n"
-"      +N\t旋转栈从而第 N 个目录(`dirs' 显示的列表中左起,从零开始)\n"
+"      +N\t旋转栈从而第 N 个目录(`dirs' 显示的列表中左起,从零开始)\n"
 "    \t将移动到栈顶。\n"
 "    \n"
-"      -N\t旋转栈从而第 N 个目录(`dirs' 显示的列表中右起,从零开始)\n"
+"      -N\t旋转栈从而第 N 个目录(`dirs' 显示的列表中右起,从零开始)\n"
 "    \t将移动到栈顶。\n"
 "    \n"
 "      dir\t将 DIR 目录添加到栈顶,并且使其成为当前工作目录。\n"
 "    \n"
-"    `dirs' å\86\85åµ\8c显示目录栈。\n"
+"    `dirs' å\86\85建显示目录栈。\n"
 "    \n"
 "    退出状态:\n"
 "    返回成功,除非使用了无效的参数或者目录转换失败。"
@@ -4953,13 +4833,13 @@ msgstr ""
 "    \t进行操作。\n"
 "    \n"
 "    参数:\n"
-"      +N\t删除第 N 个目录(`dirs' 显示的目录列表中左起,从零开始)。\n"
+"      +N\t删除第 N 个目录(`dirs' 显示的目录列表中左起,从零开始)。\n"
 "    \t例如: `popd +0' 删除第一个目录,popd +1' 删除第二个。\n"
 "    \n"
-"      -N\t删除第 N 个目录(`dirs' 显示的目录列表中右起,从零开始)。\n"
+"      -N\t删除第 N 个目录(`dirs' 显示的目录列表中右起,从零开始)。\n"
 "    \t例如: `popd -0'删除最后一个目录,,`popd -1' 删除倒数第二个。\n"
 "    \n"
-"    `dirs' å\86\85åµ\8c显示目录栈。\n"
+"    `dirs' å\86\85建显示目录栈。\n"
 "    \n"
 "    退出状态:\n"
 "    返回成功,除非使用了无效的参数或者目录变换失败。"
@@ -4981,12 +4861,10 @@ msgid ""
 "    \twith its position in the stack\n"
 "    \n"
 "    Arguments:\n"
-"      +N\tDisplays the Nth entry counting from the left of the list shown "
-"by\n"
+"      +N\tDisplays the Nth entry counting from the left of the list shown by\n"
 "    \tdirs when invoked without options, starting with zero.\n"
 "    \n"
-"      -N\tDisplays the Nth entry counting from the right of the list shown "
-"by\n"
+"      -N\tDisplays the Nth entry counting from the right of the list shown by\n"
 "    \tdirs when invoked without options, starting with zero.\n"
 "    \n"
 "    Exit Status:\n"
@@ -5018,8 +4896,7 @@ msgid ""
 "Set and unset shell options.\n"
 "    \n"
 "    Change the setting of each shell option OPTNAME.  Without any option\n"
-"    arguments, list all shell options with an indication of whether or not "
-"each\n"
+"    arguments, list all shell options with an indication of whether or not each\n"
 "    is set.\n"
 "    \n"
 "    Options:\n"
@@ -5033,7 +4910,7 @@ msgid ""
 "    Returns success if OPTNAME is enabled; fails if an invalid option is\n"
 "    given or OPTNAME is disabled."
 msgstr ""
-"设å®\9aå\92\8cå\8f\8d设定 shell 选项。\n"
+"设å®\9aå\92\8cå\8f\96æ¶\88设定 shell 选项。\n"
 "    \n"
 "    改变每个 shell 选项 OPTNAME的设定。不带参数\n"
 "    时,列出所有 shell 选项并标注每一个选项是否被\n"
@@ -5043,8 +4920,8 @@ msgstr ""
 "      -o\t限制 OPTNAME 为定义用于`set -o' 的选项\n"
 "      -p\t打印每个 shell 选项并标注它的状态。\n"
 "      -q\t抑制输出\n"
-"      -s\t启用(设定)每个 OPTNAME 选项\n"
-"      -u\t禁用(反设定)每个 OPTNAME 选项\n"
+"      -s\t启用(设定)每个 OPTNAME 选项\n"
+"      -u\t禁用(取消设定)每个 OPTNAME 选项\n"
 "    \n"
 "    退出状态:\n"
 "    如果 OPTNAME 选项被启用则返回成功;如果是\n"
@@ -5059,28 +4936,22 @@ msgid ""
 "      -v var\tassign the output to shell variable VAR rather than\n"
 "    \t\tdisplay it on the standard output\n"
 "    \n"
-"    FORMAT is a character string which contains three types of objects: "
-"plain\n"
-"    characters, which are simply copied to standard output; character "
-"escape\n"
+"    FORMAT is a character string which contains three types of objects: plain\n"
+"    characters, which are simply copied to standard output; character escape\n"
 "    sequences, which are converted and copied to the standard output; and\n"
-"    format specifications, each of which causes printing of the next "
-"successive\n"
+"    format specifications, each of which causes printing of the next successive\n"
 "    argument.\n"
 "    \n"
-"    In addition to the standard format specifications described in printf"
-"(1)\n"
+"    In addition to the standard format specifications described in printf(1)\n"
 "    and printf(3), printf interprets:\n"
 "    \n"
 "      %b\texpand backslash escape sequences in the corresponding argument\n"
 "      %q\tquote the argument in a way that can be reused as shell input\n"
-"      %(fmt)T output the date-time string resulting from using FMT as a "
-"format\n"
+"      %(fmt)T output the date-time string resulting from using FMT as a format\n"
 "            string for strftime(3)\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless an invalid option is given or a write or "
-"assignment\n"
+"    Returns success unless an invalid option is given or a write or assignment\n"
 "    error occurs."
 msgstr ""
 "在 FORMAT 变量的控制下格式化并打印 ARGUMENTS 参数。\n"
@@ -5089,8 +4960,7 @@ msgstr ""
 "      -v var\t将输出赋值给 shell 变量 VAR 而不显示在标准输出上\n"
 "    \n"
 "    FORMAT 变量是包含三种对象的字符串:简单地被拷贝到标准输出的普通字符;\n"
-"    被变换之后拷贝到标准输入的转义字符;以及每个都会影响到下个参数的打印"
-"的    格式化声明。\n"
+"    被变换之后拷贝到标准输入的转义字符;以及每个都会影响到下个参数的打印的    格式化声明。\n"
 "    \n"
 "    在 printf(1)、printf(3) 中描述的标准控制声明之外,printf解析:\n"
 "、    \n"
@@ -5104,10 +4974,8 @@ msgstr ""
 msgid ""
 "Specify how arguments are to be completed by Readline.\n"
 "    \n"
-"    For each NAME, specify how arguments are to be completed.  If no "
-"options\n"
-"    are supplied, existing completion specifications are printed in a way "
-"that\n"
+"    For each NAME, specify how arguments are to be completed.  If no options\n"
+"    are supplied, existing completion specifications are printed in a way that\n"
 "    allows them to be reused as input.\n"
 "    \n"
 "    Options:\n"
@@ -5149,8 +5017,7 @@ msgid ""
 "Display possible completions depending on the options.\n"
 "    \n"
 "    Intended to be used from within a shell function generating possible\n"
-"    completions.  If the optional WORD argument is supplied, matches "
-"against\n"
+"    completions.  If the optional WORD argument is supplied, matches against\n"
 "    WORD are generated.\n"
 "    \n"
 "    Exit Status:\n"
@@ -5170,12 +5037,9 @@ msgstr ""
 msgid ""
 "Modify or display completion options.\n"
 "    \n"
-"    Modify the completion options for each NAME, or, if no NAMEs are "
-"supplied,\n"
-"    the completion currently being executed.  If no OPTIONs are given, "
-"print\n"
-"    the completion options for each NAME or the current completion "
-"specification.\n"
+"    Modify the completion options for each NAME, or, if no NAMEs are supplied,\n"
+"    the completion currently being executed.  If no OPTIONs are given, print\n"
+"    the completion options for each NAME or the current completion specification.\n"
 "    \n"
 "    Options:\n"
 "    \t-o option\tSet completion option OPTION for each NAME\n"
@@ -5211,7 +5075,7 @@ msgstr ""
 "    \n"
 "    参数:\n"
 "    \n"
-"    æ¯\8f个 NAME å\90\8d称é\83½å¯¹åº\94ä¸\80个ä¹\8bå\89\8d以é\80\9aè¿\87 `complete' å\86\85åµ\8c定义了补完声明的\n"
+"    æ¯\8f个 NAME å\90\8d称é\83½å¯¹åº\94ä¸\80个ä¹\8bå\89\8d以é\80\9aè¿\87 `complete' å\86\85建定义了补完声明的\n"
 "    命令。如果不提供 NAME 名称,当前生成补完的函数必须调用 compopt,\n"
 "    并且当前执行的补完生成器选项会被修改。\n"
 "    \n"
@@ -5223,24 +5087,18 @@ msgstr ""
 msgid ""
 "Read lines from the standard input into an indexed array variable.\n"
 "    \n"
-"    Read lines from the standard input into the indexed array variable "
-"ARRAY, or\n"
-"    from file descriptor FD if the -u option is supplied.  The variable "
-"MAPFILE\n"
+"    Read lines from the standard input into the indexed array variable ARRAY, or\n"
+"    from file descriptor FD if the -u option is supplied.  The variable MAPFILE\n"
 "    is the default ARRAY.\n"
 "    \n"
 "    Options:\n"
-"      -n count\tCopy at most COUNT lines.  If COUNT is 0, all lines are "
-"copied.\n"
-"      -O origin\tBegin assigning to ARRAY at index ORIGIN.  The default "
-"index is 0.\n"
+"      -n count\tCopy at most COUNT lines.  If COUNT is 0, all lines are copied.\n"
+"      -O origin\tBegin assigning to ARRAY at index ORIGIN.  The default index is 0.\n"
 "      -s count \tDiscard the first COUNT lines read.\n"
 "      -t\t\tRemove a trailing newline from each line read.\n"
-"      -u fd\t\tRead lines from file descriptor FD instead of the standard "
-"input.\n"
+"      -u fd\t\tRead lines from file descriptor FD instead of the standard input.\n"
 "      -C callback\tEvaluate CALLBACK each time QUANTUM lines are read.\n"
-"      -c quantum\tSpecify the number of lines read between each call to "
-"CALLBACK.\n"
+"      -c quantum\tSpecify the number of lines read between each call to CALLBACK.\n"
 "    \n"
 "    Arguments:\n"
 "      ARRAY\t\tArray variable name to use for file data.\n"
@@ -5250,13 +5108,11 @@ msgid ""
 "    element to be assigned and the line to be assigned to that element\n"
 "    as additional arguments.\n"
 "    \n"
-"    If not supplied with an explicit origin, mapfile will clear ARRAY "
-"before\n"
+"    If not supplied with an explicit origin, mapfile will clear ARRAY before\n"
 "    assigning to it.\n"
 "    \n"
 "    Exit Status:\n"
-"    Returns success unless an invalid option is given or ARRAY is readonly "
-"or\n"
+"    Returns success unless an invalid option is given or ARRAY is readonly or\n"
 "    not an indexed array."
 msgstr ""
 "从标准输入读取行到下表数组变量中。\n"
@@ -5305,8 +5161,7 @@ msgstr ""
 #~ "; this extra information can be used to\n"
 #~ "    provide a stack trace.\n"
 #~ "    \n"
-#~ "    The value of EXPR indicates how many call frames to go back before "
-#~ "the\n"
+#~ "    The value of EXPR indicates how many call frames to go back before the\n"
 #~ "    current one; the top frame is frame 0."
 #~ msgstr ""
 #~ "; 这个额外信息可被用于\n"
index b3e0125fccf20be1a05de312b9c2045375be5fee..07c95de96bf2dfeaeae037e9136eacf517f0de38 100644 (file)
@@ -101,10 +101,6 @@ kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill
 ./errors1.sub: line 1: .: -i: invalid option
 .: usage: . filename [arguments]
 ./errors1.sub: line 9: shift: -4: shift count out of range
-./errors1.sub: line 5: return: -1: invalid option
-return: usage: return [n]
 ./errors1.sub: line 14: break: -1: loop count out of range
-./errors1.sub: line 20: return: -2: invalid option
-return: usage: return [n]
 after f
 ./errors.tests: line 264: `!!': not a valid identifier