Не может предложить пользователю, использующему комнату bultin быстрая опция-i с xargs, и найти

Решение с использованием COMM на основе хранения всех переменных до и после:

#!/bin/bash 

# Storing variables before:
set -o posix
set > $TMP/VariablesBefore.txt
sort $TMP/VariablesBefore.txt -o $TMP/VariablesBeforeSorted.txt

a=3
b=7

# Storing variables after:
set > $TMP/VariablesNow.txt
sort $TMP/VariablesNow.txt -o $TMP/VariablesNowSorted.txt

# Computing differences:
echo "The variables inside the script are: "
comm -3 $TMP/VariablesBeforeSorted.txt $TMP/VariablesNowSorted.txt

Ну, есть еще несколько переменных, оставшихся вроде _ или Bash_Lineeno ], но это ставка, которую я достиг.

Обратите внимание, что это решение не может работать во всех случаях, например Переменные очень длинные (КБ), с новой строкой коды или переменные включая имена переменной. Спасибо, Миксерв, для указывающего.

0
08.12.2014, 21:01
4 ответа

Проблема в том, что stdin (стандартный ввод) для команды, запущенной с xargs (в данном случае rm ) перенаправляется с / dev / null , а stdin - это дескриптор файла, используемый rm для получения подтверждения пользователя.

Вы можете использовать параметр -a , чтобы rm получал список файлов из промежуточного файла, ранее созданного командой find (параметр -a делает xargs , чтобы оставить stdin нетронутым), в любом случае, я понимаю, это может быть не то, что вам действительно нужно, поскольку для этого требуется промежуточный файл. Более прямой подход, подобный тому, что вы хотели, может быть получен с помощью следующей команды:

for i in $ (find. -Name file); do rm -i "$ i"; done

0
28.01.2020, 02:36

xargs считывает данные из stdin. Когда вы используете rm -i rm также пытается прочитать ответ из stdin (попробуйте touch test && echo y | r -i test ; ls test), но stdin закрыт xargs (я полагаю), поэтому rm реагирует так, как будто вы нажали ctrl-d на приглашение.

Другим решением может быть опция -exec:

touch test
find . -name test -exec rm -i {} \;
2
28.01.2020, 02:36
     Just try that command

    find . -type f -iname filename -delete


  it is better to delete the need file.

   -type f ----> specific the file type ( file or directory or etc. )
   -iname  ----> ignore the case sensitive ( test or Test)
   -delete ----> its one of find command option, its delete files  
0
28.01.2020, 02:36

Вы можете использовать параметр POSIX-okдля find, чтобы он спрашивал вас, следует ли продолжать выполнение команды (, отличной от подсказки, это точно так же, как-exec)

touch file
find. -name 'file' -ok rm -f {} \;

Выход

< rm..../file > ? _
2
20.08.2021, 12:41

Теги

Похожие вопросы