Я новичок в Linux. Когда я создаю новый файл .gitignore в текущем каталоге, используя bash, я обнаружил, что могу сделать:
> .gitignore
или
touch .gitignore
Кажется, они делают то же самое. Когда я проверяю руководство на touch
это, оно говорит, что изменяет метку времени для текущего файла, но нет никакого руководства для >
. Так может кто-нибудь объяснить, что можно >
сделать, и есть ли разница в использовании этих двух команд в этом контексте? Благодарю.
command-line
Стив Дэн Зиши
источник
источник
man bash
. Это длинный документ, и на его понимание уйдут дни или даже недели, но его стоит изучить, если вы хотите тщательно изучить Bash.Ответы:
>
является оператором перенаправления оболочки. См. В чем разница между ">" и ">>" в команде оболочки? и когда я должен использовать <или <() или << и> или> ()? Он в основном используется для перенаправления вывода команды в файл. Если файл не существует, оболочка создает его. Если он существует, оболочка обрезает его (очищает). С просто> file
нет команды, поэтому оболочка создает файл, но не отправляет выходные данные, поэтому чистый эффект заключается в создании пустого файла или очистке существующего файла.touch
это внешняя команда, которая создает файл или обновляет временную метку, как вы уже знаете. Приtouch
этом содержимое файла не теряется, если оно существует, в отличие от>
.Поведение
>
зависит от оболочки. В bash, dash и большинстве оболочек все> foo
будет работать так, как вы ожидаете. В zsh по умолчанию> foo
работает какcat > foo
- zsh ждет, пока вы введете ввод.источник
>> file
и ,touch file
но , еслиfile
не существует, есть большая разница между ними обоими и> file
(в том , что предыдущее содержимоеfile
теряется). Кроме того, противоречивое поведение zsh означаетtouch file
«самый безопасный», и поэтому его следует запомнить как «Правильный способ сделать это».Вот интересное сравнение:
Результат:
источник
strace
должен показывать выполняемые системные вызовы, а> file.txt
метод - это наименьшее количество выполненных системных вызовов, что на самом деле не так уж удивительно - чем сложнее инструмент, тем сложнее его системные вызовы. Проблема с показанными примерами, однако, заключается в том, чтоstrace
запись вstderr
поток выполняется по умолчанию, и в этом ответе Стивен использует канал только для чтенияstderr
, поэтому я немного запутался, как он подсчитывал строки, используя|
канал, а не|&
|&
, как упоминает @Serg, я получаю отсчеты примерно пятую часть от здесь ... за исключениемvi
случая, когда я получаю примерно одинаковое значение