Cygwin bash sed блокирует мои файлы

12

Когда я изменяю файлы в cygwin bash с помощью команды sed, файл блокируется.

Воспроизводить:

  1. Открыть cmdи cdв непользовательский каталог (например temp)
  2. echo aaa > test.txt
  3. Откройте в texteditor, добавьте строку, попробуйте сохранить => работает
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt"
  5. В texteditor добавьте еще одну строку и попытайтесь сохранить => "Доступ запрещен"

WTF ?! Как я могу сохранить файл без блокировки или впоследствии освободить его?

  • Разрешения безопасности Windows, похоже, полностью прикручены к файлу:

    Разрешения до:

    разрешения до (изображение!)

    Разрешения после:

    разрешения после (Изображение!)

  • Однако работает в пользовательском каталоге ( Desktop)

  • Я проверил файл с помощью LockHunter, но процесс блокировки файла не отображается
  • Cygwin FAQ упоминает о помехах в некоторых программах. Он попытался удалить Antivir и Catalyst и перезагрузить компьютер.
  • Попытка UnxTools (вылетает), GnuWin32 (sed не поддерживает подстановку на месте), Interex (инсталлятор не поддерживает W7 Pro) ... * вздох *
Дональд Дак
источник
2
Это звучит так, как будто чокнутая философия Windows «должна защищать пользователей от самих себя», я вижу это все время, когда пытаюсь смешивать и сопоставлять файлы Windows и Cygwin / Linux. Удачи.
Shellter
+1 лямбдор. Я проверил это поведение в Cygwin, и вы правы. Это довольно странно. Файл не заблокирован (т.е. не используется). Права доступа к файлам только для чтения / чтения могут быть изменены.
Я использовал GnuWin32 sed на W7 64bit и не имел проблем с заменой на месте. Это sed 4.2.1, которую я скачал с проектом getGnuWin32 .
Спенсер Рэтбун

Ответы:

8

соответствующий списку рассылки Cygwin , используйте noacl для монтирования

$ mount -o binary,posix=0,user,noacl C:/tmp /mnt/tmp

или непосредственно в Windows ../cygwin/fstabперед запуском Cygwin bash

C:/tmp /mnt/tmp ntfs binary,posix=0,user,noacl 0 0
Камил Мачоровский
источник
5

У меня была точно такая же проблема после использования find в сочетании с grep и sed в cygwin для автоматической обработки папки, полной файлов исходного кода Java. Сед испортил разрешения файлов NTFS для моих файлов, которые оставались постоянными после перезагрузки, поэтому я искал простой способ исправить это.

Я на самом деле нашел простой способ вернуть права доступа к файлам к старым значениям. Это можно сделать для всей папки рекурсивно, что важно для меня, поскольку я изменил сразу столько файлов (несколько сотен). К сожалению, я знаю только немецкие имена для пунктов меню, поэтому я не уверен, как пункты меню (в проводнике Windows) вызываются на правильном английском языке.

На немецком языке вы делаете: Щелкните правой кнопкой мыши на родительской папке папки, в которой я использовал sed, «Eigenschaften» (контекстное меню), «Sicherheit» (вкладка в диалоговом окне), «Erweitert» (кнопка), «Berechtigungen ändern ... "(кнопка с подсказкой UAC), теперь я просто проверяю оба флажка (верхний уже установлен, но нижний нет, но должен быть). Теперь я нажимаю «ОК» три раза.

Фактическое изменение, сделанное этим, заключается в том, что нижний флажок вынуждает Windows рекурсивно заменять текущие разрешения для содержимого папки на разрешения для папки, которую вы щелкнули правой кнопкой мыши, поэтому все сломанные разрешения будут исправлены. Работал для меня как шарм, а также очень быстро (всего несколько секунд для большого количества файлов).

Возможные переводы (угадал я):

  • "Eigenschaften" -> "Недвижимость"
  • "Sicherheit" -> "Безопасность"
  • "Erweitert" -> "Продвинутый"
  • "Berechtigungen ändern ..." -> "Изменить разрешения ..."
Рольф Фиманн
источник
2

Я запустил свой собственный набор тестов, и, действительно, права доступа к файлу установлены в r-xr-x --- после того, как команда sed и последующие команды cygwin воспримут это как файл только для чтения.

C:\Temp>echo aaa > test.txt
C:\Temp>ls -l
total 1
----------+ 1 bikeguy ???????? 6 Feb 21 08:51 test.txt
C:\temp>sed -i 's/aaa/bbb/' test.txt
C:\temp>cat test.txt
bbb
C:\temp>ls -l test.txt
-r-xr-x---+ 1 bikeguy mkgroup-l-d 5 Feb 21 08:52 test.txt
C:\temp>

Эти разрешения -r-xr-x --- предотвращают последующую запись некоторыми программами:

C:\temp>echo xxx > test.txt
Access is denied.
C:\temp>

Таким образом, обходной путь должен был бы добавить дополнительный chmod в файл

C:\temp>chmod 777 test.txt
C:\temp>echo xxx > test.txt
C:\temp>
Стивен Куан
источник
странная вещь - первая маска прав доступа '---------- + 1 bikeguy ????????' что я также столкнулся с использованием Cygwin / Windows. Затем вы пишете «Эти права доступа -r-xr-x --- предотвращают последующую запись некоторых программ:» Так что, возможно, «некоторые программы» работают в другой группе И потому что нет доступа через «другие» разрешения, что вызывает проблема? Спасибо, эта отладка помогла мне с этой проблемой. Всем удачи.
Shellter
Да, @shellter Я тоже это заметил, когда искал ответ. Я предположил, что строка «----------- +» означает, что безопасность не существует (поэтому у вас есть полный доступ), тогда как «-r-xr-x --- +» означает, что безопасность существует там, где есть доступ для записи. отсутствует. Если я выполнил команду chmod 000, я также получу '---------- +', но на этот раз определенно есть безопасность, и у меня нет привилегий читать или писать этот файл.
Я использую git версии 1.9.5.msysgit.1, я также вижу ту же проблему, я использую chmod 777 test.txtкоманду, чтобы обойти эту проблему.
ollydbg23