• R/O
  • SSH
  • HTTPS

yash: Commit


Commit MetaInfo

Revision3902 (tree)
Time2018-10-06 15:20:01
Authormagicant

Log Message

Reject keywords after redirection (#38617)

Change Summary

Incremental Difference

--- yash/trunk/NEWS (revision 3901)
+++ yash/trunk/NEWS (revision 3902)
@@ -24,8 +24,11 @@
2424 * An invalid semicolon that appears at the beginning of a line as a
2525 result of alias substitution in a for loop is now correctly
2626 rejected.
27- * For strict POSIXly-correctness, an IO_NUMBER token can no longer
28- be the operand of a redirection.
27+ . For more strict POSIXly-correctness, some syntactic constructions
28+ are now regarded as an error in the POSIXly-correct mode:
29+ * An IO_NUMBER token cannot be the operand of a redirection.
30+ * Keywords immediately following a redirection are not
31+ recognized.
2932 . Updated the sample initialization script (yashrc):
3033 = The prompt strings are now defined with the $YASH_PS...
3134 variables.
--- yash/trunk/doc/ja/posix.txt (revision 3901)
+++ yash/trunk/doc/ja/posix.txt (revision 3902)
@@ -24,6 +24,7 @@
2424 - +$(+ と +)+ で囲んだ{zwsp}link:expand.html#cmdsub[コマンド置換]に含まれるコマンドは、コマンド置換が実行される時に毎回解析されます。
2525 - link:expand.html#arith[数式展開]で小数ならびに `++` および `--` 演算子が使えません。数値でない変数は常にエラーになります。
2626 - link:redir.html[リダイレクト]の対象を示すトークンは次のリダイレクトのファイル記述子を示す整数と紛らわしくないようにしなければなりません。
27+- link:redir.html[リダイレクト]を伴う{zwsp}link:syntax.html#compound[複合コマンド]の直後に +}+ や +fi+ などの予約語を置くことはできません。
2728 - link:redir.html#file[ファイルのリダイレクト]で、{zwsp}link:expand.html#glob[パス名展開]の結果が一つでない場合、すぐにはエラーにせず、パス名展開を行わなかったときと同様に扱います。
2829 - link:redir.html#socket[ソケットリダイレクト]・{zwsp}link:redir.html#here[ヒアストリング]・{zwsp}link:redir.html#pipe[パイプリダイレクト]・{zwsp}link:redir.html#process[プロセスリダイレクト]は使用できません。
2930 - link:exec.html#simple[単純コマンドの実行]時、コマンドが見つからなくても link:params.html#sv-command_not_found_handler[+COMMAND_NOT_FOUND_HANDLER+ 変数]の値は実行しません。
--- yash/trunk/doc/posix.txt (revision 3901)
+++ yash/trunk/doc/posix.txt (revision 3902)
@@ -54,6 +54,9 @@
5454 `++` and `--` operators cannot be used. All variables must be numeric.
5555 - The operand of a link:redir.html[redirection] cannot be the integer prefix
5656 to a next redirection operator.
57+- A link:syntax.html#compound[compound command] with a
58+ link:redir.html[redirection] cannot be immediately followed by a keyword
59+ like +}+ and +fi+.
5760 - In a link:redir.html#file[redirection to a file], if the
5861 link:expand.html#glob[pathname expansion] yielded more than one or no
5962 pathname, it is not immediately treated as an error. Instead, the shell
--- yash/trunk/parser.c (revision 3901)
+++ yash/trunk/parser.c (revision 3902)
@@ -2307,7 +2307,23 @@
23072307 default:
23082308 return NULL;
23092309 }
2310+
2311+ assert(result->c_redirs == NULL);
23102312 parse_redirect_list(ps, &result->c_redirs);
2313+ if (posixly_correct && result->c_redirs != NULL && ps->token != NULL &&
2314+ ps->tokentype != TT_WORD) {
2315+ /* A token that follows a redirection cannot be a keyword because
2316+ * none of the rules in POSIX XCU 2.4 apply. This means
2317+ * { { echo; } }
2318+ * and
2319+ * { { echo; } >/dev/null; }
2320+ * are OK but
2321+ * { { echo; } >/dev/null }
2322+ * is not. */
2323+ serror(ps, Ngt("unexpected word after redirection"));
2324+ serror(ps, Ngt("(maybe you missed `%ls'?)"), L";");
2325+ }
2326+
23112327 return result;
23122328 }
23132329
--- yash/trunk/po/ja.po (revision 3901)
+++ yash/trunk/po/ja.po (revision 3902)
@@ -8,8 +8,8 @@
88 msgstr ""
99 "Project-Id-Version: yash 2.48\n"
1010 "Report-Msgid-Bugs-To: http://osdn.jp/projects/yash/forums/\n"
11-"POT-Creation-Date: 2018-09-30 21:52+0900\n"
12-"PO-Revision-Date: 2018-09-30 21:55+0900\n"
11+"POT-Creation-Date: 2018-10-06 15:04+0900\n"
12+"PO-Revision-Date: 2018-10-06 15:19+0900\n"
1313 "Last-Translator: WATANABE Yuki <magicant@users.osdn.me>\n"
1414 "Language-Team: Japanese\n"
1515 "Language: ja\n"
@@ -234,7 +234,7 @@
234234
235235 #: builtins/test.c:82 builtins/test.c:425 parser.c:852 parser.c:1349
236236 #: parser.c:1437 parser.c:1462 parser.c:1594 parser.c:1633 parser.c:2142
237-#: parser.c:2466 parser.c:2554 parser.c:2634
237+#: parser.c:2482 parser.c:2570 parser.c:2650
238238 #, c-format
239239 msgid "`%ls' is missing"
240240 msgstr "「%ls」が抜けています"
@@ -1004,7 +1004,7 @@
10041004 msgid "`%ls' is used outside `case'"
10051005 msgstr "「%ls」が case コマンドの外で使われています"
10061006
1007-#: parser.c:810 parser.c:812 parser.c:2650
1007+#: parser.c:810 parser.c:812 parser.c:2666
10081008 #, c-format
10091009 msgid "`%ls' cannot be used as a command name"
10101010 msgstr "「%ls」はコマンド名として使えません"
@@ -1034,7 +1034,7 @@
10341034 msgid "encountered `%ls' without a matching `case'"
10351035 msgstr "「%ls」に対応する「case」がありません"
10361036
1037-#: parser.c:850
1037+#: parser.c:850 parser.c:2324
10381038 #, c-format
10391039 msgid "(maybe you missed `%ls'?)"
10401040 msgstr "(「%ls」を忘れていませんか?)"
@@ -1115,70 +1115,74 @@
11151115 msgid "put a space between `%lc' and `%lc' for disambiguation"
11161116 msgstr "「%lc」と「%lc」の間に空白が必要です"
11171117
1118-#: parser.c:2342 parser.c:2384 parser.c:2471 parser.c:2515
1118+#: parser.c:2323
1119+msgid "unexpected word after redirection"
1120+msgstr "リダイレクトの直後に不正な単語があります"
1121+
1122+#: parser.c:2358 parser.c:2400 parser.c:2487 parser.c:2531
11191123 #, c-format
11201124 msgid "commands are missing between `%ls' and `%ls'"
11211125 msgstr "「%ls」と「%ls」の間にコマンドがありません"
11221126
1123-#: parser.c:2396 parser.c:2505
1127+#: parser.c:2412 parser.c:2521
11241128 #, c-format
11251129 msgid "commands are missing after `%ls'"
11261130 msgstr "「%ls」の後にコマンドがありません"
11271131
1128-#: parser.c:2433
1132+#: parser.c:2449
11291133 msgid "an identifier is required after `for'"
11301134 msgstr "「for」の後には識別子が必要です"
11311135
1132-#: parser.c:2435
1136+#: parser.c:2451
11331137 #, c-format
11341138 msgid "`%ls' is not a valid identifier"
11351139 msgstr "「%ls」は有効な識別子ではありません"
11361140
1137-#: parser.c:2455
1141+#: parser.c:2471
11381142 msgid "`;' cannot appear on a new line"
11391143 msgstr "「;」は行頭に置けません"
11401144
1141-#: parser.c:2544 parser.c:2617 parser.c:2664
1145+#: parser.c:2560 parser.c:2633 parser.c:2680
11421146 #, c-format
11431147 msgid "a word is required after `%ls'"
11441148 msgstr "「%ls」の後には単語が必要です"
11451149
1146-#: parser.c:2607
1150+#: parser.c:2623
11471151 msgid "an unquoted `esac' cannot be the first case pattern"
11481152 msgstr "クォートしていない「esac」を最初のパターンにすることはできません"
11491153
1150-#: parser.c:2620
1154+#: parser.c:2636
11511155 #, c-format
11521156 msgid "encountered an invalid character `%lc' in the case pattern"
11531157 msgstr "case のパターン内に不正な文字「%lc」があります"
11541158
1155-#: parser.c:2696 parser.c:2750
1159+#: parser.c:2712 parser.c:2766
11561160 msgid "a function body must be a compound command"
11571161 msgstr "関数の本体は複合コマンドでなければなりません"
11581162
1159-#: parser.c:2718
1163+#: parser.c:2734
11601164 #, c-format
11611165 msgid "invalid use of `%lc'"
11621166 msgstr "「%lc」の使い方が正しくありません"
11631167
1164-#: parser.c:2725
1168+#: parser.c:2741
11651169 msgid "invalid function name"
11661170 msgstr "無効な関数名です"
11671171
1168-#: parser.c:2735
1172+#: parser.c:2751
11691173 msgid "`(' must be followed by `)' in a function definition"
11701174 msgstr "関数定義では「(」の直後に「)」が必要です"
11711175
1172-#: parser.c:2763
1176+#: parser.c:2779
11731177 msgid "the end-of-here-document indicator contains a newline"
11741178 msgstr "ヒアドキュメントの終端子に改行が入っています"
11751179
1176-#: parser.c:2790 parser.c:2824
1180+#: parser.c:2806 parser.c:2840
11771181 #, c-format
11781182 msgid "the here-document content is not closed by `%ls'"
11791183 msgstr "ヒアドキュメントが「%ls」で閉じられていません"
11801184
1181-#: parser.c:2876
1185+#: parser.c:2892
11821186 #, c-format
11831187 msgid "here-document content for %s%ls is missing"
11841188 msgstr "%s%ls に対応するヒアドキュメントの内容がありません"
Show on old repository browser