Это должно быть подходящей заменой:
grep -l foo * | sed -e 's/[^/0-9A-Z_a-z]/\\&/g' | xargs sed -i 's/foo/bar/g'
Для обнаружения, какие команды маскируются псевдонимами сделайте что-то вроде этого:
alias | sed 's/^[^ ]* *\|=.*$//g' | while read a; do
printf "%20.20s : %s\n" $a "$(type -ta $a | tr '\n' ' ')"
done | awk -F: '$2 ~ /file/'
alias
один списки определили псевдонимы и sed
извлекает их имя. Выполнения цикла с условием продолжения type -ta
на каждом из них и awk
печатает строки, что и содержите псевдоним и файл.
Можно использовать type
узнать, как команда была бы интерпретирована ударом.
which
, но я не делаю теперь, если оба (тип, который) окружают builtins, то же.
– math
17.12.2012, 09:16
type which
говорит Вам which is /usr/bin/which
, таким образом, это не встроенное. Поэтому это не может сказать Вам, является ли что-то встроенным или не (например. which echo
по сравнению с type echo
).
– choroba
17.12.2012, 10:21
type which
which is a shell builtin
Я использую zsh.
– math
17.12.2012, 10:38
Как Ваш первый вопрос, нет никакого способа перечислить конфликты, начиная с использования удара хеш-таблица внутренне, это только записывает последнее переопределение.
Чтобы узнать, является ли команда псевдонимом, использовать alias ls
в Вашем случае, если это говорит Вам что-то как "не найденный" затем, это не псевдоним, иначе это.
Для запуска исходной функции, игнорируя псевдоним снабдите префиксом наклонную черту, например, \ls
запустится реальное хешировало ls, проигнорируйте псевдоним.
Править
Если Вы хотите знать быстро, если команда является псевдонимом, Вы могли бы включить режим отладки set -x
, теперь, если Вы выполняетесь ls
:
Вы будете видеть вывод отладки реальной выполняемой команды
Для сбрасывания режима отладки использовать set -
alias
часть. Что, если пользователь не знает, что там существует команда (например. ls
)? Только вещь он, кажется, знает после выполнения alias ls
то, что является отображенным на и не, с чем это было первоначально отображено. Я предполагаю, что нужно будет выполнить все команды с и без \для нахождения конфликтов.
– user13107
18.10.2012, 09:31
Можно использовать встроенный удар compgen
получить список всей команды и всего использования псевдонимов compgen -ac
. Любая команда, которая является также псевдонимом, будет дублирована в этом списке, таким образом, простое наивное решение будет состоять в том, чтобы искать дубликаты в выводе compgen -ac
.
Однако дубликаты могут также появиться, если команда находится на пути дважды. Например, я имею /bin/which
и /usr/bin/which
так compgen -ac
перечислит which
дважды даже при том, что это не псевдоним.
Таким образом, то, что необходимо, должно получить все дубликаты от compgen -ac
и сравните это со списком псевдонимов. Только дубликаты, которые являются также псевдонимами, являются теми псевдонимами, которые скрывают команды. Мы можем сделать это с comm(1)
команда и с ударом обрабатывает замену.
comm -12 <(compgen -a | sort) <(compgen -ac | sort | uniq -d)
compgen -a | sort
список всех псевдонимов (отсортированный для comm
). compgen -ac | sort | uniq -d
список всех дубликатов из списка команд и псевдонимов. comm -12
выводы только те строки, которые характерны для обоих.
Можно использовать функцию отладки оболочки для наблюдения точно, что происходит, когда удар вызывает интерактивную оболочку. Следующее должно показать Вам всем псевдонимы, которые присвоены, когда интерактивная оболочка порождена от оболочки входа в систему:
bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
-x
-> позволяют отладить-l
-> входят в оболочку-i
-> интерактивная оболочка-c
-> командаВыполнение выхода команды требуется так, чтобы оболочка возвратилась. -i
требуется в этом случае, потому что удар не настроил бы интерактивную среду для выполнения команды иначе.
Вот пример от моей системы:
$ bash -x -l -i -c 'exit' 2>&1 | grep ' alias '
++ alias 'ls=ls --color=auto'
$ alias -p
alias ls='ls --color=auto'
Для наблюдения, какой файл был в последний раз получен, когда псевдониму присвоили определить файл, он произошел, можно расширить grep:
bash -x -l -i -c 'exit' 2>&1 | grep -E ' (alias|[.]|source) '
Это может возвратить ложные положительные стороны, но должно быть прекрасным при ручном осмотре возвращенного данные. Количество '+' символы перед выполняемой командой указывает на глубину.
+ . /home/jordan/.bashrc
++ alias 'ls=ls --color=auto'
++ . /home/jordan/.foo
+++ alias t=test
++ alias t=test2
В этом демонстрационном выводе это показывает, что .bashrc устанавливает псевдоним для ls
. псевдонимы нечто t
, и затем .bashrc переопределяет предыдущий псевдоним t
.