Одинарные левые кавычки старого стиля ` `
действительно рассматривайте обратные косые черты и немного отличающееся вложение. Новый стиль $()
интерпретирует все промежуточное ( )
как команда.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
работы, если вложенных одинарных левых кавычек оставляют:
echo `uname | \`echo cat\``
Linux
забава обратной косой черты:
echo $(echo '\\')
\\
echo `echo '\\'`
\
Новый стиль $()
относится ко всем совместимым на POSIX оболочкам.
Как mouviciel указанный, старого стиля ` `
могло бы быть необходимым для более старых оболочек.
Кроме технической точки зрения, старого стиля ` `
имеет также визуальный недостаток:
I like $(program) better than `program`
'`'`''`''`'`''`'
(и использование SE ` `
для собственной цели это была боль, пишущий этот ответ :)
Как насчет того, чтобы использовать su
команда?
$ whoami
user1
$ su - user2
Password:
$ whoami
user2
$ exit
logout
Если Вы хотите войти в систему как корень, нет никакой потребности указать имя пользователя:
$ whoami
user1
$ su -
Password:
$ whoami
root
$ exit
logout
Обычно можно использовать sudo
для запуска новой оболочки как, пользователь, Вы хотите; -u
флаг позволяет Вам указать имя пользователя, которое Вы хотите:
$ whoami
user1
$ sudo -u user2 zsh
$ whoami
user2
Существует больше окольных путей, если у Вас нет sudo доступа, как ssh username@localhost, но sudo
является, вероятно, самым простым, при условии, что это установлено, и у Вас есть разрешение использовать его.
Обычно Вы используете sudo
для запуска новой оболочки как, пользователь, Вы хотите; -u
флаг позволяет Вам указать имя пользователя, которое Вы хотите:
[mrozekma@etudes-1 ~] % whoami
mrozekma
[mrozekma@etudes-1 ~] % sudo -u nobody zsh
[nobody@etudes-1 ~] % whoami
nobody
Существует больше окольных путей, если у Вас нет sudo доступа, как ssh username@localhost
, но я думаю sudo
является, вероятно, самым простым, если это установлено, и у Вас есть разрешение использовать его
sudo -s
дает Вам оболочку как su
, sudo -i
моделирует вход в систему как su -
. Может быть объединен с -u $user
, конечно.
– ephemient
27.10.2010, 23:41
$ whoami
Эта команда печатает текущего пользователя. Чтобы изменить пользователей, мы должны использовать эту команду (за которой следует пароль пользователя):
$ su secondUser
Password:
После ввода правильного пароля, вы войдете в систему под именем указанного пользователя (что можно проверить, повторно запустив whoami
).
Если вы сменили имя хоста на «богон», поэтому приглашение изменилось. При необходимости можно изменить переменную $ PS1
в /etc/bash.bashrc
так, чтобы она всегда отображала username @ localhost
вместо username @ hostname
.
Мой сценарий работает, если оба значения, разделенные разделителем, имеют одинаковое количество символов.
Если бы вы хотели произвольное количество мест, это было бы невозможно, потому что вы могли бы попасть в такие ситуации, как:
key1 12|1222 10|15
key1 12 10
key1 1222 15
В этой ситуации вы просто не можете выровнять '15' в столбец под '10', потому что столбец уже занят '1222'.
EDIT: Я переписал код, поэтому он принимает произвольное количество строк и даже произвольное количество труб:-)
CODE:
script.sh:
#!/bin/bash
# count max number of pipes -> recognizes number of lines
countPipes() {
num=0
line="$@"
IFS=' '
for item in $line; do
tmp=$(echo "$item" | tr -d "[:alnum:][:space:]" | wc -c)
if [[ "$num" < "$tmp" ]]; then
num=$tmp
fi
done
return $num
}
makeLines() {
strTmp="$@" # one line from input file
arrTmp=($strTmp)
key=${arrTmp[0]}
arrIN=$key
# create output arrays (one array = one output line)
countPipes $strTmp
maxPipeCount=$? # assign the value of the last 'return'
for((i=0;i<$maxPipeCount;++i)); do
arrOUT[$i]="$key"
done
for item in ${strTmp[@]}; do
# Delimiter handling
if [[ $item == *\|* ]]; then # If there is a pipe
IFS='|'
tmp=($item) # variable containing pipe character -> split by space -> array
IFS=' '
arrIN="$arrIN ${tmp[0]}"
for ((i=0;i<"${#arrOUT[@]}";++i)); do # fill columns in every output line - i = index in line
if [[ "${#tmp[$(($i + 1))]}" -gt 0 ]]; then
arrOUT[$i]="${arrOUT[$i]} ${tmp[$(($i + 1))]}"
else
# Handling spaces in output
for ((j=0;j<="${#tmp[0]}";++j)); do # filling line with spaces - j = just counter, not index
arrOUT[$i]="${arrOUT[$i]} "
done
fi
done
elif [[ "$item" != "$key" ]]; then # If there isn't a pipe
arrIN="$arrIN $item"
# Handling spaces in output
for ((i=0;i<"${#arrOUT[@]}";++i)); do # for every output line
for j in { 1.."${#tmp[0]}" }; do # for every char in $item
arrOUT[$i]="${arrOUT[$i]} "
done
done
fi
done
# PRINT RESULTS
echo "$arrIN"
for((i=0;i<"${#arrOUT[@]}";++i)); do # for every output line
echo "${arrOUT[$i]}"
done
unset arrOUT
echo '-----------------------------------------------------------'
}
while read line; do # load data from STDIN
makeLines $line
done
Пример:
test.txt:
key1 10|15 20 30 11|XX|55 21 31|20 100
key2 11 25|30 58|22 44 33
key3 12|15|17|19 22 33 55|22 88|44|11 xxxx|2222|7777
Команда:
bash ./script.sh < test.txt
OUTPUT:
key1 10 20 30 11 21 31 100
key1 15 XX 20
key1 55
-----------------------------------------------------------
key2 11 25 58 44 33
key2 30 22
-----------------------------------------------------------
key3 12 22 33 55 88 xxxx
key3 15 22 44 2222
key3 17 11 7777
key3 19
-----------------------------------------------------------
-121--23392- Чтобы переключить сеанс терминала на другого пользователя, где этот пользователь не может вернуться к исходному пользователю, используйте exec:
$ | # exec su - [имя _ пользователя]
Это позволит технически зарегистрировать нового пользователя в новом терминологическом процессе и закрыть текущий. Таким образом, когда пользователь пытается выйти или Ctrl-D, терминал закрывается, как если бы этот пользователь был тем, кто создал его экземпляр, то есть пользователь не может выйти обратно в термин исходного пользователя. Вроде бы бессмысленно, учитывая, что они все еще могут просто начать новый терминальный сеанс и автоматически быть в исходном пользовательском термин логин, но есть.
ПРАВКА: Для того, чтобы заблокировать терминальные сессии по умолчанию, можно использовать команду linux vlock в ~/.bashrc, требуя пароль пользователя term session для разблокировки. Это в некоторой степени предотвратит перезапуск вышеупомянутого термина в исходном пользовательском контексте, поскольку этот термин не создается с использованием значения, отличного от значения по умолчанию ~/.bashrc пользователя, как настроено.
Если требуется решение shellscript (которое также работает с OSX
), см. башлок .
Вы также можете установить в
службу/демон, который выполняет задания на основе временных характеристик, таких как «now + 7 дни». Сначала запустите atd
(через сценарии init
или systemd
или upstart
и т.д.). Затем поставьте задание в очередь с
at -f /path/to/command now + 7 days
, чтобы запустить его через 7 дней, или
at 2am tomorrow
и прочитайте команды, которые будут выполняться завтра в 2 утра. Вы хотите сделать тест или два, прежде чем ждать 7 дней, чтобы обнаружить, что он не сработал. Попробуйте сейчас + 1 минута
Один из способов выполнения пакета каждые 7 дней состоит в том, чтобы добавить пакет к другой по команде
:
cat >~/bin/weekly-job.sh << AT
at -f ~/bin/weekly-job.sh now + 7 days
~/bin/database-job.sh
AT
-121--174642- ~$ sudo login
, после чего появится запрос на ввод пароля sudo (текущего пароля пользователя).
Также убедитесь, что текущий пользователь находится в файле sudoers!
Если вы используете Ubuntu,и если для пользователя, под которым вы хотите войти, не установлен пароль:
sudo su - username
Введите свой собственный пароль, и он должен быть установлен. Конечно, для этого требуется, чтобы ваш пользователь имел права на получение привилегий root с помощью sudo
.
Еще один путь - запустить новую оболочку от имени другого (не root) пользователя, чтобы выполнять команды от имени этого пользователя.
ubuntu@aws-ip:~$ sudo -u mongodb bash #<-- or zsh, etc...
mongodb@aws-ip:~$ mongod --configsvr --dbpath /data/configdb --fork
Примером может служить пользователь mongodb
. При развертывании кластера MongoDB с шардированием все необходимые процессы должны выполняться от имени mongodb
, и нет необходимости (или не совсем удобно) демонизировать эти процессы с помощью init-скриптов для десятков узлов.
Давайте разберемся: вы вошли в систему как UserA и хотите «войти» как UserB для выполнения некоторых команд, но после этого хотите вернуться к UserA. Для простоты я предполагаю, что вы хотите запустить ls -l / tmp как UserB. Если вы не хотите покинуть текущую оболочку UserA, а скорее выполняете команду как UserB и по-прежнему находитесь в системе как UserA, вам следует сделать следующее:
su - UserB -c "ls -l /tmp" <-- Just an example
Предполагается, что вы знаете пароль для UserB. Однако, если вы не знаете пароль пользователя B, вам необходимо знать пароль root. Затем:
sudo su - UserB -c "ls -l /tmp" <-- UserB's pw not needed here
Если вы предпочитаете временно войти в систему как UserB для выполнения множества команд, просто выполните:
sudo su - UserB
Это даст вам новую оболочку для UserB (проверьте это, набрав id). Когда закончите, вы можете нажать ctrl-d и вернуться к своему логину.
Если вам нужно запустить только одну команду, вы можете использовать sudo :sudo -u username command
su - [user]
может быть полезным - дополнительный тире дает Вам оболочку входа в систему. – ephemient 27.10.2010, 23:40-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
---------121 большое спасибо--------44882----за Ваш ответ. Я уже установил его через виртуальную машину, как объяснено в вышеупомянутом ответе. BTW поле семени mandriva, кажется, более легкая опция. Конечно, попробует его в следующий раз, когда кажется, что $PWD оценен только в первый разapt-get -t stable install php5-memcached
Не работал:php5-memcached : Depends: libmemcached11 but it is not installable E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).
---------121 спасибо--------138639----, но это не работало на меня. Я отодвинул папку, впоследствии перезапустил gedit, но тем не менее темой является нестандартная, а также используемые плагины являются теми, я имел в прошлый раз, когда я используюrm -f
часто наclean
цель вMakefile
s--------121--------55005----@terdon я использую GNUgrep
2.12--------121--------137117----Спасибо за Ваш ответ. Но можно ли сказать что-то больше относительно того, каков тот рекурсивный метод? Я слышу его в 1-й раз, когда кажется, что этот сценарий делает то же самое три раза, я установил его на том же разделе, где я установил его в прошлый раз Эй, я не перерабатывал это, как прошлый раз, Даl
этимологически для длинного целого со времени гдеlong
s, где 32 бита шириной.l
остался и, как гарантируют, останется 32 бита шириной даже в системы гдеlong
s более широки (такl
больше средстваlong
на практике). Использоватьl!
если Вы хотите свою систему/компиляторlong
s--------121--------122412----[root@CentOS-7} # об/мин-ql iptables-services.x86_64/etc/sysconfig/ip6tables/etc/sysconfig/iptables/usr/lib/systemd/system/ip6tables.service/usr/lib/systemd/system/iptables.service/usr/libexec/initscripts/legacy-actions/ip6tables/usr/libexec/initscripts/legacy-actions/ip6tables/panic/usr/libexec/initscripts/legacy-actions/ip6tables/save/usr/libexec/initscripts/legacy-actions/iptables/usr/libexec/initscripts/legacy-actions/iptables/panic/usr/libexec/initscripts/legacy-actions/iptables/save/usr/libexec/iptables/usr/libexec/iptables/ip6tables.init/usr/libexec/iptables/iptables.init---------121--------78156-Удостоверяется, что помнил это в следующий раз, когда я получаю эту ошибку "-su:/dev/stderr: Разрешение, отклоненное" после выполнения этой командыecho >>/dev/stderr
на входе в систему сsu --login ...
, какая-либо подсказка? Я нашел этот btw unix.stackexchange.com/questions/38538 / … – Aquarius Power 24.11.2014, 20:58env
это видело, что все было в порядке, а также визуальный контроль может пойти; И одна вещь была неправильной:XAUTHORITY=/home/user1/.Xauthority'. Not sure _why_? So X-window doesn't work by default because the protection on
~/.Xauthority' файл:-rw-------
. Я сделал копию, и это позволило мне выполнить gedit как эксперимент. – will 26.12.2015, 13:47