Это команды, написанные новичком, который либо ничего не узнал с начала 90-х, либо следует HOWTO той эпохи. Было бы лучше записать так:
num_rec=$(wc -l
Здесь используется подстановка команд для получения счетчика строк из test.cv
с использованием wc -l
(путем перенаправления, чтобы wc
не выводит имя файла вместе со счетчиком строк).
Затем он снова использует подстановку команд, на этот раз с printf
и строкой формата для обнуления счетчика строк так, чтобы он имел фиксированную ширину 6 цифр, с арифметикой оболочки для добавления 2 к $ num_rec
.
$ 1
в исходной команде awk
ссылается на первое поле ввода (в данном случае счетчик строк из wc
)
{ {1}}
Вы не должны запускать редактор от имени пользователя root без крайней необходимости; вам следует использовать sudoedit
или административные функции среды рабочего стола.
sudoedit
После того, как sudoedit
настроен должным образом, вы можете сделать
SUDO_EDITOR="/opt/sublime_text/sublime_text -w" sudoedit yourfile
sudoedit
, чтобы проверить, разрешено ли вам это делать, сделайте копию файла, которую вы можете отредактируйте, не меняя идентификаторы вручную, запустите редактор, а затем, когда редактор закроется, скопируйте файл обратно, если он был изменен.
Я бы предложил функцию, а не псевдоним:
function susubl {
export SUDO_EDITOR="/opt/sublime_text/sublime_text -w"
sudoedit "$@"
}
хотя, как указал Джефф Шаллер , вы можете использовать env
, чтобы поместить это в псевдоним и избежать изменения вашего среда оболочки:
alias susubl='env SUDO_EDITOR="/opt/sublime_text/sublime_text -w" sudoedit'
Параметр -w
гарантирует, что вызов Sublime Text ждет, пока файлы не будут закрыты, прежде чем вернуться и позволить sudoedit
скопировать файлы обратно.
В GNOME (и, возможно, других средах рабочего стола) вы можете использовать любой редактор с поддержкой GIO / GVFS с префиксом admin: //
; например
gedit admin:///path/to/your/file
Это запросит соответствующую аутентификацию с помощью PolKit, а затем откроет файл для редактирования, если аутентификация прошла успешно.
Это расширение ответа Стивена Китта , подходящее для тех, кто ищет готовое -–-решение для использования.
Вам, конечно, следует составить свой собственный список избранных редакторов, это всего лишь пример, заполнить список выбранными вами редакторами.
### Generic function text editing as root. ###
# The proper = safe way through sudoedit.
# Various things are taken into account like aliases or a specific Code case.
sudoedit_run ()
{
# check the minimum number of arguments
if [ $# -lt 3 ]; then
printf '%b\n' "sudoedit_run(): Low number of arguments.\\nExpected: \$1 = editor name; \$2 = wait option; \$3, (\$4),... = file(s).\\nPassed $#: $*" >&2
return 1
fi
# let's take a closer look at the first argument, the editor
editor_name=$1
# store an editor alias, if there is any
editor_alias=$( alias "${editor_name}" 2> /dev/null )
# remove that alias for now
if [ -n "${editor_alias}" ]; then unalias "${editor_name}"; fi
# store the first 2 arguments to variables
editor_path=$( command -v "${editor_name}" ); wait_option=$2
# check if that editor exists on this system
if ! [ -x "${editor_path}" ]; then
printf '%b\n' "sudoedit_run(): The editor ('${editor_name}') path ('${editor_path}') does not exist on this system." >&2
return 1
fi
# let's move past the editor and its wait option to the actual files
shift 2
# env - use it or not? + why?
SUDO_EDITOR="${editor_path} ${wait_option}" sudoedit "$@"
# re-define the editor alias, if there was any
if [ -n "${editor_alias}" ]; then eval "${editor_alias}"; fi
}
#--------------------------------------------------------------------
### editor aliases generators / definitions ###
## CLI editors
# shellcheck disable=SC2139
for cli_editor in vi nano; do
alias su${cli_editor}="sudoedit_run ${cli_editor} ''"
done
## GUI editors
# shellcheck disable=SC2139
for gui_editor in subl xed gedit; do
alias su${gui_editor}="sudoedit_run ${gui_editor} -w"
done
# vscode-specific workaround under root
alias sucode="sudo code -w --user-data-dir=/root/.vscode"
#--------------------------------------------------------------------
### other aliases definitions ###
# we can use aliases for editors with the above code, for example
alias code='code --reuse-window'
Это решение вы можете поместить, например, непосредственно в свой .bash_aliases
файл.
Узнайте, по какому пути находится ваш редактор, например.:
$ which nano
/usr/local/bin/nano
Как видите, я использую скомпилированную nano
, а не упакованную версию; независимо от того, это может измениться с system/config на другой system/config.
Текстовые редакторы CLI , такие как vi
или nano
, не нуждаются в опции ожидания , vi
использует механизм блокировки, а nano
нет, поэтому для скомпилированных nano
и предварительно -установленных vi
можно было бы написать такие функции:
sunano () { env SUDO_EDITOR='/usr/local/bin/nano' sudoedit "$@"; }
suvi () { env SUDO_EDITOR='/usr/bin/vi' sudoedit "$@"; }
Текстовые редакторы GUI , напротив, такие как встроенный в Linux Mint xed
, бесплатные программы, такие как Visual Studio Code (code
), или платные программы, такие как Sublime Text(subl
)у всех есть опция ожидание , и вам нужно использовать ее, чтобы избежать проблемы, описанной в моем вопросе, вы можете использовать что-то похожее на эти функции:
susubl () { env SUDO_EDITOR='/opt/sublime_text/sublime_text -w' sudoedit "$@"; }
suxed () { env SUDO_EDITOR='/usr/bin/xed -w' sudoedit "$@"; }
-w
(--wait
)графического интерфейса редактора Параметр-w
(--wait
)фактически делает то, что редактор будет ожидать на терминале, пока вы не закроете его, таким образом, ожидая закрытия редактора, позволяя планировать и выполнять дальнейшие действия при закрытии редактора, в данном случае чтобы сохранить изменения sudoedit
. Обычно он просто освобождал терминал, и вы получали новое приглашение.
Представьте другое полезное использование для этого,самостоятельный -объяснительный:
code -w ~/.bash_aliases;. ~/.bash_aliases
Надеюсь, на этом примере я понятнее.
Другое решение :Я никогда не редактирую системные файлы напрямую, я делаю копию где-нибудь (*), редактирую копию (с помощью моего обычного редактора )и sudo cp
, когда закончу.
(*)Для этого у меня есть директория, где все файлы хранятся в одном месте: