awk -F, 'NF > 1 { $1 = $2 } { print $1 }' file
Это использует awk
для разбора файла как строк, состоящих из полей, разделенных запятыми -.
Код определяет, когда в строке имеется более одного поля, и когда это так, первое поле заменяется вторым полем. Затем печатается первое поле, либо неизмененное, либо модифицированное условным кодом.
Добавление .
к пути означает, что исполняемые файлы в текущем каталоге рассматриваются оболочкой, в результате чего вам больше не нужно вводить ./
в качестве префикса . В вашем случае, поскольку это последняя запись, такие команды будут выполняться только в том случае, если перед этим ничего не совпадает; так, например, ls
по-прежнему будет работать /bin/ls
.
Есть несколько причин, по которым это обычно не рекомендуется (см. ссылку выше):
.
в качестве последней записи, а не первый; ./
означает, что будет использована первая совпадающая команда в пути, не обязательно та, которая находится в текущем каталоге. Немного предыстории :Переменная окружения PATH представляет собой список каталогов, разделенных двоеточиями. Когда вы вводите имя команды, не указывая явный путь (, например. вы набираете «ls», а не «/bin/ls» )ваша оболочка ищет все каталоги в списке PATH по порядку, ища исполняемый файл с таким именем, и оболочка запускает первую подходящую программу, которую находит.
Один из каталогов в списке PATH может быть текущим каталогом ".". Также допустимо использовать пустое имя каталога в списке PATH для указания текущего каталога. Оба они эквивалентны
для пользователей csh:
setenv PATH :/usr/ucb:/bin:/usr/bin
setenv PATH.:/usr/ucb:/bin:/usr/bin
для пользователей sh или ksh
PATH=:/usr/ucb:/bin:/usr/bin export PATH
PATH=.:/usr/ucb:/bin:/usr/bin export PATH
Наличие "." где-то в PATH удобно -вы можете ввести «a.out» вместо «./a.out», чтобы запускать программы в текущем каталоге. Но есть одна загвоздка.
Рассмотрим, что происходит в случае, когда "." является первой записью в PATH. Предположим, что ваш текущий каталог является публично -доступным для записи, например, "/tmp". Если там просто окажется программа с именем «/tmp/ls», оставленная каким-то другим пользователем, и вы наберете «ls» (, намереваясь, конечно, запустить обычную программу «/bin/ls» ), ваша оболочка вместо этого запустит "./ls", программу другого пользователя. Излишне говорить, что результаты запуска такой неизвестной программы могут вас удивить.
Немного лучше иметь "." в конце ПУТИ:
setenv PATH /usr/ucb:/bin:/usr/bin:.
Теперь, если вы находитесь в /tmp и набираете «ls», оболочка будет искать в /usr/ucb, /bin и /usr/bin программу с именем «ls», прежде чем найдет время для поиска в «. ", и снижается риск непреднамеренного запуска программы "ls" другого пользователя. Однако это не на 100% безопасно -, если вы неуклюжий машинист и когда-нибудь наберете «sl -l» вместо «ls -l», вы рискуете запустить «./sl», если он есть.Какой-нибудь «умный» программист мог бы предвидеть типичные ошибки при наборе текста и оставить программы с такими именами разбросанными по общедоступным каталогам. Остерегаться.
Многие опытные пользователи Unix прекрасно обходятся без "." вообще в PATH:
setenv PATH /usr/ucb:/bin:/usr/bin
Если вы сделаете это, вам нужно будет ввести «./program» вместо «program», чтобы запускать программы в текущем каталоге, но повышение безопасности, вероятно, того стоит.