Если вы сменили имя хоста на «богон», поэтому приглашение изменилось. При необходимости можно изменить переменную $ PS1
в /etc/bash.bashrc
так, чтобы она всегда отображала username @ localhost
вместо username @ hostname
.
-121--146239-
Мой сценарий работает, если оба значения, разделенные разделителем, имеют одинаковое количество символов.
Если бы вы хотели произвольное количество мест, это было бы невозможно, потому что вы могли бы попасть в такие ситуации, как:
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 пользователя, как настроено.