aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/rm.test2
-rw-r--r--toys/posix/rm.c4
2 files changed, 6 insertions, 0 deletions
diff --git a/tests/rm.test b/tests/rm.test
index 9f2b8012..ab6a97d7 100755
--- a/tests/rm.test
+++ b/tests/rm.test
@@ -11,6 +11,8 @@ echo "abcdefghijklmnopqrstuvwxyz" > file.txt
testing "text-file" "rm file.txt && [ ! -e file.txt ] && echo 'yes'" "yes\n" "" ""
rm -f file*
+testing "-i nonexistent" "</dev/zero rm -i file.txt 2>/dev/null || echo 'yes'" "yes\n" "" ""
+
mkdir dir
testing "empty directory" "rm -r dir && [ ! -d dir ] && echo 'yes'" "yes\n" "" ""
rm -rf dir
diff --git a/toys/posix/rm.c b/toys/posix/rm.c
index 8874b54f..2a6bc282 100644
--- a/toys/posix/rm.c
+++ b/toys/posix/rm.c
@@ -37,6 +37,10 @@ static int do_rm(struct dirtree *try)
// This is either the posix section 2(b) prompt or the section 3 prompt.
if (!FLAG(f)
&& (!S_ISLNK(try->st.st_mode) && faccessat(fd, try->name, W_OK, 0))) or++;
+
+ // Posix section 1(a), don't prompt for nonexistent.
+ if (or && errno == ENOENT) goto skip;
+
if (!(dir && try->again) && ((or && isatty(0)) || FLAG(i))) {
char *s = dirtree_path(try, 0);