<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@linuxhowto</title><author><name>@linuxhowto</name></author><id>https://teletype.in/atom/linuxhowto</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/linuxhowto?offset=0"></link><link rel="alternate" type="text/html" href="https://linuxhowto.ru/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=linuxhowto"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/linuxhowto?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-05-03T13:32:04.068Z</updated><entry><id>linuxhowto:strace</id><link rel="alternate" type="text/html" href="https://linuxhowto.ru/strace?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=linuxhowto"></link><title>Шпаргалка по strace</title><published>2023-10-20T10:09:54.885Z</published><updated>2023-10-20T12:20:59.789Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c1/86/c186952c-c0d6-4a9b-82c7-767ddce2f08c.png"></media:thumbnail><category term="strace" label="strace"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/cf/67/cf676ec7-6cb7-4abb-bf57-da18360a2858.png&quot;&gt;Дебажим работу программы</summary><content type="html">
  &lt;p id=&quot;6jDH&quot;&gt;Трассировка программы&lt;/p&gt;
  &lt;pre id=&quot;8iGF&quot; data-lang=&quot;bash&quot;&gt;strace ./program&lt;/pre&gt;
  &lt;p id=&quot;dFte&quot;&gt;Трассировка запущенного процесса&lt;/p&gt;
  &lt;pre id=&quot;6H8a&quot; data-lang=&quot;bash&quot;&gt;strace -p [pid]&lt;/pre&gt;
  &lt;p id=&quot;sIhh&quot;&gt;Трассировка запущенного процесса и его потомков(форков)&lt;/p&gt;
  &lt;pre id=&quot;j0nD&quot; data-lang=&quot;bash&quot;&gt;strace -fp [pid]&lt;/pre&gt;
  &lt;h2 id=&quot;hmzK&quot;&gt;Форматирование вывода&lt;/h2&gt;
  &lt;p id=&quot;4kNg&quot;&gt;Трассировка запущенного процесса и его потомков с длинной строки 80 символов(команда напечатает первые 80 символов каждой строки). По-умолчанию, длинна строки равна 32 символам. Важно, что имена файлов не учитываются в длинне строки и всегда печатаются полностью.&lt;/p&gt;
  &lt;pre id=&quot;hhvD&quot; data-lang=&quot;bash&quot;&gt;strace -s 80 -fp [pid]&lt;/pre&gt;
  &lt;h2 id=&quot;bfi3&quot;&gt;Время и логирование&lt;/h2&gt;
  &lt;p id=&quot;BxBU&quot;&gt;Трассировка процесса с указанием времени выполнения каждого системного вызова&lt;/p&gt;
  &lt;pre id=&quot;xXVC&quot; data-lang=&quot;bash&quot;&gt;strace -Tf ./program&lt;/pre&gt;
  &lt;p id=&quot;T7Zr&quot;&gt;Трассировка процесса с указанием времени в которое был выполнен системный вызов&lt;/p&gt;
  &lt;pre id=&quot;8CaQ&quot; data-lang=&quot;bash&quot;&gt;strace -t ./program&lt;/pre&gt;
  &lt;p id=&quot;ffcZ&quot;&gt;включая микросекунды&lt;/p&gt;
  &lt;pre id=&quot;ZC8O&quot; data-lang=&quot;bash&quot;&gt;strace -tt ./program&lt;/pre&gt;
  &lt;p id=&quot;aX9Q&quot;&gt;unix формат времени с микросекундами&lt;/p&gt;
  &lt;pre id=&quot;hXS9&quot; data-lang=&quot;bash&quot;&gt;strace -ttt ./program&lt;/pre&gt;
  &lt;p id=&quot;SsLE&quot;&gt;Логирование в файл&lt;/p&gt;
  &lt;pre id=&quot;dQJ4&quot; data-lang=&quot;bash&quot;&gt;strace -o ./file.log ./program&lt;/pre&gt;
  &lt;p id=&quot;wnTt&quot;&gt;Запись в отдельный файл лога каждого процесса. (Комбинация опций --follow-forks и --output-separately)&lt;/p&gt;
  &lt;pre id=&quot;x2DB&quot; data-lang=&quot;bash&quot;&gt;strace -ff -o ./file.log ./program&lt;/pre&gt;
  &lt;h2 id=&quot;QwwT&quot;&gt;Фильтрация&lt;/h2&gt;
  &lt;p id=&quot;DF6d&quot;&gt;Фильтр по системным вызовам open,read,write&lt;/p&gt;
  &lt;pre id=&quot;K79x&quot; data-lang=&quot;bash&quot;&gt;strace -Tfe trace=open,read,write ./program&lt;/pre&gt;
  &lt;h2 id=&quot;m5uY&quot;&gt;Статистика&lt;/h2&gt;
  &lt;p id=&quot;96kd&quot;&gt;Выводит сводную таблицу по затраченному времени, вызовам, ошибкам.&lt;/p&gt;
  &lt;pre id=&quot;Feku&quot; data-lang=&quot;bash&quot;&gt;strace -c ./program&lt;/pre&gt;

</content></entry><entry><id>linuxhowto:xx3VanqCJqy</id><link rel="alternate" type="text/html" href="https://linuxhowto.ru/xx3VanqCJqy?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=linuxhowto"></link><title>Bash cheatsheet</title><published>2022-10-21T19:32:19.785Z</published><updated>2022-10-21T19:32:19.785Z</updated><category term="bash-linux" label="Bash/Linux"></category><summary type="html">Редактирование команд bash</summary><content type="html">
  &lt;h3 id=&quot;DEn1&quot;&gt;Cheatsheets&lt;/h3&gt;
  &lt;pre id=&quot;gusE&quot; data-lang=&quot;bash&quot;&gt;$(&amp;lt; file) # Тоже что $(cat file)
|&amp;amp; # На ввод следующей команде попадет как stdout так и stderr
expr ? expr : expr 
условие ? выраж1 : выраж2 # Условный оператор в форме тернарного. Если условие истинно, тогда выполниться выраж1 в противном случае выраж2&lt;/pre&gt;
  &lt;h3 id=&quot;xa5S&quot;&gt;Variables&lt;/h3&gt;
  &lt;pre id=&quot;2JNm&quot; data-lang=&quot;bash&quot;&gt;NAME=&amp;quot;John&amp;quot;
echo $NAME
echo &amp;quot;$NAME&amp;quot;
echo &amp;quot;${NAME}&amp;quot;&lt;/pre&gt;
  &lt;h3 id=&quot;QoCv&quot;&gt;String quotes&lt;/h3&gt;
  &lt;pre id=&quot;0vON&quot; data-lang=&quot;bash&quot;&gt;NAME=&amp;quot;John&amp;quot;
echo &amp;quot;Hi $NAME&amp;quot;  #=&amp;gt; Hi John
echo &amp;#x27;Hi $NAME&amp;#x27;  #=&amp;gt; Hi $NAME&lt;/pre&gt;
  &lt;h3 id=&quot;WLZX&quot;&gt;Shell execution&lt;/h3&gt;
  &lt;pre id=&quot;G2EQ&quot; data-lang=&quot;bash&quot;&gt;echo &amp;quot;I&amp;#x27;m in $(pwd)&amp;quot;
echo &amp;quot;I&amp;#x27;m in &amp;#x60;pwd&amp;#x60;&amp;quot;&lt;/pre&gt;
  &lt;h3 id=&quot;N6nT&quot;&gt;Conditional execution&lt;/h3&gt;
  &lt;pre id=&quot;WBtK&quot; data-lang=&quot;bash&quot;&gt;git commit &amp;amp;&amp;amp; git push # AND
git commit || echo &amp;quot;Commit failed&amp;quot; # OR&lt;/pre&gt;
  &lt;h3 id=&quot;obLz&quot;&gt;Functions&lt;/h3&gt;
  &lt;pre id=&quot;stwr&quot; data-lang=&quot;bash&quot;&gt;get_name() {
  echo &amp;quot;John&amp;quot;
}
echo &amp;quot;You are $(get_name)&amp;quot;&lt;/pre&gt;
  &lt;h3 id=&quot;YN4E&quot;&gt;Conditionals&lt;/h3&gt;
  &lt;pre id=&quot;j3FR&quot; data-lang=&quot;bash&quot;&gt;if [[ -z &amp;quot;$string&amp;quot; ]]; then
  echo &amp;quot;String is empty&amp;quot;
elif [[ -n &amp;quot;$string&amp;quot; ]]; then
  echo &amp;quot;String is not empty&amp;quot;
fi

-a file # True if file exists.
-b file # True if file exists and is a block special file.
-c file # True if file exists and is a character special file.
-d file # True if file exists and is a directory.
-e file # True if file exists.
-f file # True if file exists and is a regular file.
-g file # True if file exists and its set-group-id bit is set.
-h file # True if file exists and is a symbolic link.
-k file # True if file exists and its &amp;quot;sticky&amp;quot; bit is set.
-p file # True if file exists and is a named pipe (FIFO).
-r file # True if file exists and is readable.
-s file # True if file exists and has a size greater than zero.
-t fd # True if file descriptor fd is open and refers to a terminal.
-u file # True if file exists and its set-user-id bit is set.
-w file # True if file exists and is writable.
-x file # True if file exists and is executable.
-G file # True if file exists and is owned by the effective group id.
-L file # True if file exists and is a symbolic link.
-N file # True if file exists and has been modified since it was last read.
-O file # True if file exists and is owned by the effective user id.
-S file # True if file exists and is a socket.
file1 -ef file2 # True if file1 and file2 refer to the same device and inode numbers.
file1 -nt file2 # True if file1 is newer (according to modification date) than file2, or if file1 exists and file2 does not.
file1 -ot file2 # True if file1 is older than file2, or if file2 exists and file1 does not.
-o optname # True if the shell option optname is enabled. The list of options appears in the description of the -o option to the set builtin (see The Set Builtin).
-v varname # True if the shell variable varname is set (has been assigned a value).
-R varname # True if the shell variable varname is set and is a name reference.
-z string # True if the length of string is zero.
-n string # True if the length of string is non-zero.
string1 == string2
string1 = string2 # True if the strings are equal. ‘=’ should be used with the test command for POSIX conformance.
string1 != string2 # True if the strings are not equal.
string1 &amp;lt; string2 # True if string1 sorts before string2 lexicographically.
string1 &amp;gt; string2 # True if string1 sorts after string2 lexicographically.
arg1 OP arg2 # OP is one of ‘-eq’, ‘-ne’, ‘-lt’, ‘-le’, ‘-gt’, or ‘-ge’. These arithmetic binary operators return true if arg1 is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to arg2, respectively. Arg1 and arg2 may be positive or negative integers. When used with the [[ command, Arg1 and Arg2 are evaluated as arithmetic expressions&lt;/pre&gt;
  &lt;h3 id=&quot;NJQK&quot;&gt;Strict mode&lt;/h3&gt;
  &lt;pre id=&quot;oOxW&quot; data-lang=&quot;bash&quot;&gt;set -euo pipefail
IFS=$&amp;#x27;\n\t&amp;#x27;&lt;/pre&gt;
  &lt;h3 id=&quot;qILD&quot;&gt;Brace expansion&lt;/h3&gt;
  &lt;pre id=&quot;BfyA&quot; data-lang=&quot;bash&quot;&gt;echo {A,B}.js
{A,B}       # Same as A B
{A,B}.js    # Same as A.js B.js
{1..5}      # Same as 1 2 3 4 5
{0..10..2}  # Same as 0 2 4 6 8 10&lt;/pre&gt;
  &lt;h2 id=&quot;cf68&quot;&gt;Parameter expansions&lt;/h2&gt;
  &lt;h3 id=&quot;QA5K&quot;&gt;Basics&lt;/h3&gt;
  &lt;pre id=&quot;J4I3&quot; data-lang=&quot;bash&quot;&gt;name=&amp;quot;John&amp;quot;
echo ${name}
echo ${name/J/j}    #=&amp;gt; &amp;quot;john&amp;quot; (substitution)
echo ${name:0:2}    #=&amp;gt; &amp;quot;Jo&amp;quot; (slicing)
echo ${name::2}     #=&amp;gt; &amp;quot;Jo&amp;quot; (slicing)
echo ${name::-1}    #=&amp;gt; &amp;quot;Joh&amp;quot; (slicing)
echo ${name:(-1)}   #=&amp;gt; &amp;quot;n&amp;quot; (slicing from right)
echo ${name:(-2):1} #=&amp;gt; &amp;quot;h&amp;quot; (slicing from right)
echo ${food:-Cake}  #=&amp;gt; $food or &amp;quot;Cake&amp;quot;
length=2
echo ${name:0:length}  #=&amp;gt; &amp;quot;Jo&amp;quot;

STR=&amp;quot;/path/to/foo.cpp&amp;quot;
echo ${STR%.cpp}    # /path/to/foo
echo ${STR%.cpp}.o  # /path/to/foo.o

echo ${STR##*.}     # cpp (extension)
echo ${STR##*/}     # foo.cpp (basepath)

echo ${STR#*/}      # path/to/foo.cpp
echo ${STR##*/}     # foo.cpp

echo ${STR/foo/bar} # /path/to/bar.cpp

STR=&amp;quot;Hello world&amp;quot;
echo ${STR:6:5}   # &amp;quot;world&amp;quot;
echo ${STR:-5:5}  # &amp;quot;world&amp;quot;
SRC=&amp;quot;/path/to/foo.cpp&amp;quot;
BASE=${SRC##*/}   #=&amp;gt; &amp;quot;foo.cpp&amp;quot; (basepath)
DIR=${SRC%$BASE}  #=&amp;gt; &amp;quot;/path/to/&amp;quot; (dirpath)&lt;/pre&gt;
  &lt;h3 id=&quot;2j6l&quot;&gt;Substitution&lt;/h3&gt;
  &lt;pre id=&quot;VutW&quot; data-lang=&quot;bash&quot;&gt;${FOO%suffix}   # Remove suffix
${FOO#prefix}   # Remove prefix
${FOO%%suffix}  # Remove long suffix
${FOO##prefix}  # Remove long prefix
${FOO/from/to}  # Replace first match
${FOO//from/to} # Replace all
${FOO/%from/to} # Replace suffix
${FOO/#from/to} # Replace prefix&lt;/pre&gt;
  &lt;h3 id=&quot;oVnn&quot;&gt;Comments&lt;/h3&gt;
  &lt;pre id=&quot;Jk6B&quot; data-lang=&quot;bash&quot;&gt;# Single line comment
: &amp;#x27;
This is a
multi line
comment
&amp;#x27;&lt;/pre&gt;
  &lt;h3 id=&quot;DZFq&quot;&gt;Substrings&lt;/h3&gt;
  &lt;pre id=&quot;ehhW&quot; data-lang=&quot;bash&quot;&gt;${FOO:0:3}  # Substring (position, length)
${FOO:-3:3} # Substring from the right&lt;/pre&gt;
  &lt;h3 id=&quot;nXMT&quot;&gt;Length&lt;/h3&gt;
  &lt;pre id=&quot;ruqs&quot; data-lang=&quot;bash&quot;&gt;${#FOO} Length of $FOO&lt;/pre&gt;
  &lt;h3 id=&quot;Ta5x&quot;&gt;Manipulation&lt;/h3&gt;
  &lt;pre id=&quot;Mum1&quot; data-lang=&quot;bash&quot;&gt;STR=&amp;quot;HELLO WORLD!&amp;quot;
echo ${STR,}   #=&amp;gt; &amp;quot;hELLO WORLD!&amp;quot; (lowercase 1st letter)
echo ${STR,,}  #=&amp;gt; &amp;quot;hello world!&amp;quot; (all lowercase)

STR=&amp;quot;hello world!&amp;quot;
echo ${STR^}   #=&amp;gt; &amp;quot;Hello world!&amp;quot; (uppercase 1st letter)
echo ${STR^^}  #=&amp;gt; &amp;quot;HELLO WORLD!&amp;quot; (all uppercase)&lt;/pre&gt;
  &lt;h3 id=&quot;6Gmv&quot;&gt;Default values&lt;/h3&gt;
  &lt;pre id=&quot;ibAr&quot; data-lang=&quot;bash&quot;&gt;${FOO:-val} # $FOO, or val if not set
${FOO:=val} # Set $FOO to val if not set
${FOO:+val} # val if $FOO is set
${FOO:?message} # Show error message and exit if $FOO is not set
# The : is optional (eg, ${FOO=word} works)&lt;/pre&gt;
  &lt;h3 id=&quot;PruO&quot;&gt;Loops&lt;/h3&gt;
  &lt;pre id=&quot;UTp6&quot; data-lang=&quot;bash&quot;&gt;# Basic for loop
for i in /etc/rc.*; do
  echo $i
done
# C-like for loop
for ((i = 0 ; i &amp;lt; 100 ; i++)); do
  echo $i
done
# Ranges
for i in {1..5}; do
    echo &amp;quot;Welcome $i&amp;quot;
done
# With step size
for i in {5..50..5}; do
    echo &amp;quot;Welcome $i&amp;quot;
done
# Reading lines
&amp;lt; file.txt | while read line; do
  echo $line
done
# Forever
while true; do
  ···
done&lt;/pre&gt;
  &lt;h3 id=&quot;y4kx&quot;&gt;Functions&lt;/h3&gt;
  &lt;pre id=&quot;rMid&quot; data-lang=&quot;bash&quot;&gt;# Defining functions
myfunc() {
    echo &amp;quot;hello $1&amp;quot;
}

# Same as above (alternate syntax)
function myfunc() {
    echo &amp;quot;hello $1&amp;quot;
}
myfunc &amp;quot;John&amp;quot;

# Returning values
myfunc() {
    local myresult=&amp;#x27;some value&amp;#x27;
    echo $myresult
}
result=&amp;quot;$(myfunc)&amp;quot;

# Raising errors
myfunc() {
  return 1
}
if myfunc; then
  echo &amp;quot;success&amp;quot;
else
  echo &amp;quot;failure&amp;quot;
fi&lt;/pre&gt;
  &lt;h3 id=&quot;rsZm&quot;&gt;Arguments&lt;/h3&gt;
  &lt;pre id=&quot;T7Yk&quot; data-lang=&quot;bash&quot;&gt;$#  # Number of arguments
$*  # All arguments
$@  # All arguments, starting from first
$1  # First argument&lt;/pre&gt;
  &lt;h2 id=&quot;XbF8&quot;&gt;Conditionals&lt;/h2&gt;
  &lt;h3 id=&quot;jHyh&quot;&gt;Conditions&lt;/h3&gt;
  &lt;pre id=&quot;StcX&quot; data-lang=&quot;bash&quot;&gt;Note that [[ is actually a command/program that returns either 0 (true) or 1 (false). Any program that obeys the same logic (like all base utils, such as grep(1) or ping(1)) can be used as condition, see examples.
[[ -z STRING ]] # Empty string
[[ -n STRING ]] # Not empty string
[[ STRING == STRING ]]  # Equal
[[ STRING != STRING ]]  # Not Equal
[[ NUM -eq NUM ]]   # Equal
[[ NUM -ne NUM ]]   # Not equal
[[ NUM -lt NUM ]]   # Less than
[[ NUM -le NUM ]]   # Less than or equal
[[ NUM -gt NUM ]]   # Greater than
[[ NUM -ge NUM ]]   # Greater than or equal
[[ STRING =~ STRING ]]  # Regexp
(( NUM &amp;lt; NUM )) # Numeric conditions
[[ -o noclobber ]]  # If OPTIONNAME is enabled
[[ ! EXPR ]]    # Not
[[ X ]] &amp;amp;&amp;amp; [[ Y ]]  # And
[[ X ]] || [[ Y ]]  # Or

# File conditions
[[ -e FILE ]]   # Exists
[[ -r FILE ]]   # Readable
[[ -h FILE ]]   # Symlink
[[ -d FILE ]]   # Directory
[[ -w FILE ]]   # Writable
[[ -s FILE ]]   # Size is &amp;gt; 0 bytes
[[ -f FILE ]]   # File
[[ -x FILE ]]   # Executable
[[ FILE1 -nt FILE2 ]]   # 1 is more recent than 2
[[ FILE1 -ot FILE2 ]]   # 2 is more recent than 1
[[ FILE1 -ef FILE2 ]]   # Same files&lt;/pre&gt;
  &lt;h3 id=&quot;9GeD&quot;&gt;Example&lt;/h3&gt;
  &lt;pre id=&quot;kfHv&quot; data-lang=&quot;bash&quot;&gt;if ping -c 1 google.com; then
  echo &amp;quot;It appears you have a working internet connection&amp;quot;
fi
if grep -q &amp;#x27;foo&amp;#x27; ~/.bash_history; then
  echo &amp;quot;You appear to have typed &amp;#x27;foo&amp;#x27; in the past&amp;quot;
fi

# String
if [[ -z &amp;quot;$string&amp;quot; ]]; then
  echo &amp;quot;String is empty&amp;quot;
elif [[ -n &amp;quot;$string&amp;quot; ]]; then
  echo &amp;quot;String is not empty&amp;quot;
fi

# Combinations
if [[ X ]] &amp;amp;&amp;amp; [[ Y ]]; then
  ...
fi

# Equal
if [[ &amp;quot;$A&amp;quot; == &amp;quot;$B&amp;quot; ]]

# Regex
if [[ &amp;quot;A&amp;quot; =~ &amp;quot;.&amp;quot; ]]
if (( $a &amp;lt; $b )); then
   echo &amp;quot;$a is smaller than $b&amp;quot;
fi
if [[ -e &amp;quot;file.txt&amp;quot; ]]; then
  echo &amp;quot;file exists&amp;quot;
fi&lt;/pre&gt;
  &lt;h3 id=&quot;lM9D&quot;&gt;Arrays&lt;/h3&gt;
  &lt;pre id=&quot;nRHI&quot; data-lang=&quot;bash&quot;&gt;# Defining arrays
Fruits=(&amp;#x27;Apple&amp;#x27; &amp;#x27;Banana&amp;#x27; &amp;#x27;Orange&amp;#x27;)
Fruits[0]=&amp;quot;Apple&amp;quot;
Fruits[1]=&amp;quot;Banana&amp;quot;
Fruits[2]=&amp;quot;Orange&amp;quot;

# Working with arrays
echo ${Fruits[0]}           # Element #0
echo ${Fruits[@]}           # All elements, space-separated
echo ${#Fruits[@]}          # Number of elements
echo ${#Fruits}             # String length of the 1st element
echo ${#Fruits[3]}          # String length of the Nth element
echo ${Fruits[@]:3:2}       # Range (from position 3, length 2)

# Operations
Fruits=(&amp;quot;${Fruits[@]}&amp;quot; &amp;quot;Watermelon&amp;quot;)    # Add
Fruits+=(&amp;#x27;Watermelon&amp;#x27;)                  # Also add
Fruits=( ${Fruits[@]/Ap*/} )            # Remove by regex match
unset Fruits[2]                         # Remove one item
Fruits=(&amp;quot;${Fruits[@]}&amp;quot;)                 # Duplicate
Fruits=(&amp;quot;${Fruits[@]}&amp;quot; &amp;quot;${Veggies[@]}&amp;quot;) # Concatenate
lines=(&amp;#x60;cat &amp;quot;logfile&amp;quot;&amp;#x60;)                 # Read from file

# Iteration
for i in &amp;quot;${arrayName[@]}&amp;quot;; do
  echo $i
done&lt;/pre&gt;
  &lt;h3 id=&quot;iRZc&quot;&gt;Dictionaries&lt;/h3&gt;
  &lt;pre id=&quot;KZA2&quot; data-lang=&quot;bash&quot;&gt;# Defining
declare -A sounds
sounds[dog]=&amp;quot;bark&amp;quot;
sounds[cow]=&amp;quot;moo&amp;quot;
sounds[bird]=&amp;quot;tweet&amp;quot;
sounds[wolf]=&amp;quot;howl&amp;quot;
# Declares sound as a Dictionary object (aka associative array).

# Working with dictionaries
echo ${sounds[dog]} # Dog&amp;#x27;s sound
echo ${sounds[@]}   # All values
echo ${!sounds[@]}  # All keys
echo ${#sounds[@]}  # Number of elements
unset sounds[dog]   # Delete dog&lt;/pre&gt;
  &lt;h3 id=&quot;hF8N&quot;&gt;Iteration&lt;/h3&gt;
  &lt;pre id=&quot;fVA3&quot; data-lang=&quot;bash&quot;&gt;# Iterate over values
for val in &amp;quot;${sounds[@]}&amp;quot;; do
  echo $val
done

# Iterate over keys
for key in &amp;quot;${!sounds[@]}&amp;quot;; do
  echo $key
done&lt;/pre&gt;
  &lt;h3 id=&quot;1xtJ&quot;&gt;Options&lt;/h3&gt;
  &lt;pre id=&quot;mI3c&quot; data-lang=&quot;bash&quot;&gt;# Options
set -o noclobber  # Avoid overlay files (echo &amp;quot;hi&amp;quot; &amp;gt; foo)
set -o errexit    # Used to exit upon error, avoiding cascading errors
set -o pipefail   # Unveils hidden failures
set -o nounset    # Exposes unset variables

# Glob options
set -o nullglob    # Non-matching globs are removed  (&amp;#x27;*.foo&amp;#x27; =&amp;gt; &amp;#x27;&amp;#x27;)
set -o failglob    # Non-matching globs throw errors
set -o nocaseglob  # Case insensitive globs
set -o globdots    # Wildcards match dotfiles (&amp;quot;*.sh&amp;quot; =&amp;gt; &amp;quot;.foo.sh&amp;quot;)
set -o globstar    # Allow ** for recursive matches (&amp;#x27;lib/**/*.rb&amp;#x27; =&amp;gt; &amp;#x27;lib/a/b/c.rb&amp;#x27;)
# Set GLOBIGNORE as a colon-separated list of patterns to be removed from glob matches.&lt;/pre&gt;
  &lt;h3 id=&quot;J246&quot;&gt;History&lt;/h3&gt;
  &lt;pre id=&quot;0FF4&quot; data-lang=&quot;bash&quot;&gt;# Commands
history # Show history
shopt -s histverify # Don’t execute expanded result immediately
# Expansions
!$  # Expand last parameter of most recent command
!*  # Expand all parameters of most recent command
!-n # Expand nth most recent command
!n  # Expand nth command in history
!&amp;lt;command&amp;gt;  # Expand most recent invocation of command &amp;lt;command&amp;gt;
# Operations
!!  # Execute last command again
!!:s/&amp;lt;FROM&amp;gt;/&amp;lt;TO&amp;gt;/   # Replace first occurrence of &amp;lt;FROM&amp;gt; to &amp;lt;TO&amp;gt; in most recent command
!!:gs/&amp;lt;FROM&amp;gt;/&amp;lt;TO&amp;gt;/  # Replace all occurrences of &amp;lt;FROM&amp;gt; to &amp;lt;TO&amp;gt; in most recent command
!$:t    # Expand only basename from last parameter of most recent command
!$:h    # Expand only directory from last parameter of most recent command
!! and !$ # can be replaced with any valid expansion.

# Slices
!!:n    # Expand only nth token from most recent command (command is 0; first argument is 1)
!^  # Expand first argument from most recent command
!$  # Expand last token from most recent command
!!:n-m  # Expand range of tokens from most recent command
!!:n-$  # Expand nth token to last from most recent command
!! # can be replaced with any valid expansion i.e. !cat, !-2, !42, etc.&lt;/pre&gt;
  &lt;h3 id=&quot;mDRk&quot;&gt;Miscellaneous&lt;/h3&gt;
  &lt;pre id=&quot;Epah&quot; data-lang=&quot;bash&quot;&gt;# Numeric calculations
$((a + 200))      # Add 200 to $a
$((RANDOM%=200))  # Random number 0..200

# Subshells
(cd somedir; echo &amp;quot;I&amp;#x27;m now in $PWD&amp;quot;)
pwd # still in first directory
# Redirection
python hello.py &amp;gt; output.txt   # stdout to (file)
python hello.py &amp;gt;&amp;gt; output.txt  # stdout to (file), append
python hello.py 2&amp;gt; error.log   # stderr to (file)
python hello.py 2&amp;gt;&amp;amp;1           # stderr to stdout
python hello.py 2&amp;gt;/dev/null    # stderr to (null)
python hello.py &amp;amp;&amp;gt;/dev/null    # stdout and stderr to (null)
python hello.py &amp;lt; foo.txt      # feed foo.txt to stdin for python
# Inspecting commands
command -V cd
#=&amp;gt; &amp;quot;cd is a function/alias/whatever&amp;quot;
# Trap errors
trap &amp;#x27;echo Error at about $LINENO&amp;#x27; ERR
or

traperr() {
  echo &amp;quot;ERROR: ${BASH_SOURCE[1]} at about ${BASH_LINENO[0]}&amp;quot;
}

set -o errtrace
trap traperr ERR

# Case/switch
case &amp;quot;$1&amp;quot; in
  start | up)
    vagrant up
    ;;

  *)
    echo &amp;quot;Usage: $0 {start|stop|ssh}&amp;quot;
    ;;
esac

# Source relative
source &amp;quot;${0%/*}/../share/foo.sh&amp;quot;
printf
printf &amp;quot;Hello %s, I&amp;#x27;m %s&amp;quot; Sven Olga
#=&amp;gt; &amp;quot;Hello Sven, I&amp;#x27;m Olga

printf &amp;quot;1 + 1 = %d&amp;quot; 2
#=&amp;gt; &amp;quot;1 + 1 = 2&amp;quot;

printf &amp;quot;This is how you print a float: %f&amp;quot; 2
#=&amp;gt; &amp;quot;This is how you print a float: 2.000000&amp;quot;

# Directory of script
DIR=&amp;quot;${0%/*}&amp;quot;

# Getting options
while [[ &amp;quot;$1&amp;quot; =~ ^- &amp;amp;&amp;amp; ! &amp;quot;$1&amp;quot; == &amp;quot;--&amp;quot; ]]; do case $1 in
  -V | --version )
    echo $version
    exit
    ;;
  -s | --string )
    shift; string=$1
    ;;
  -f | --flag )
    flag=1
    ;;
esac; shift; done
if [[ &amp;quot;$1&amp;quot; == &amp;#x27;--&amp;#x27; ]]; then shift; fi

# Heredoc
cat &amp;lt;&amp;lt;END
hello world
END

# Reading input
echo -n &amp;quot;Proceed? [y/n]: &amp;quot;
read ans
echo $ans
read -n 1 ans    # Just one character

# Special variables
$?  # Exit status of last task
$!  # PID of last background task
$$  # PID of shell
$0  # Filename of the shell script

# Go to previous directory
pwd # /home/user/foo
cd bar/
pwd # /home/user/foo/bar
cd -
pwd # /home/user/foo&lt;/pre&gt;
  &lt;h2 id=&quot;toIX&quot;&gt;HOTKEYS&lt;/h2&gt;
  &lt;p id=&quot;WUlb&quot;&gt;Редактирование команд bash&lt;/p&gt;
  &lt;p id=&quot;v1Pg&quot;&gt;&lt;code&gt;Ctrl + a&lt;/code&gt; – перейти на начало командной строки&lt;/p&gt;
  &lt;p id=&quot;IJxg&quot;&gt;&lt;code&gt;Ctrl + e&lt;/code&gt; – перейти в конец командной строки&lt;/p&gt;
  &lt;p id=&quot;QMPf&quot;&gt;&lt;code&gt;Ctrl + k&lt;/code&gt; – удалить от курсора до конца командной строки&lt;/p&gt;
  &lt;p id=&quot;LQvY&quot;&gt;&lt;code&gt;Ctrl + u&lt;/code&gt; – удалить от курсора до начала командной строки&lt;/p&gt;
  &lt;p id=&quot;4eS6&quot;&gt;&lt;code&gt;Ctrl + w&lt;/code&gt; – удалить от курсора до начала слова&lt;/p&gt;
  &lt;p id=&quot;JN8k&quot;&gt;&lt;code&gt;Ctrl + y&lt;/code&gt; – вставить слово или текст который был вырезано с использованием одного из подходящих сочетаний клавиш&lt;/p&gt;
  &lt;p id=&quot;OpS8&quot;&gt;&lt;code&gt;Ctrl + xx&lt;/code&gt; – переместиться между началом командной строки и текущим положением курсора (работает в обе стороны)&lt;/p&gt;
  &lt;p id=&quot;qGvX&quot;&gt;&lt;code&gt;Alt + b&lt;/code&gt; – переместить курсор на одно слово назад (или переместиться на начало текущего слова)&lt;/p&gt;
  &lt;p id=&quot;sJeR&quot;&gt;&lt;code&gt;Alt + f&lt;/code&gt; – переместиться вперед на одно слово (или к началу текущего слова)&lt;/p&gt;
  &lt;p id=&quot;RGcH&quot;&gt;&lt;code&gt;Alt + d&lt;/code&gt; – удалить до конца слова начиная с текущего положения курсора (все слово, если курсор находится в его начале)&lt;/p&gt;
  &lt;p id=&quot;61un&quot;&gt;&lt;code&gt;Alt + c&lt;/code&gt; – сделать букву заглавной и переместиться в конец слова&lt;/p&gt;
  &lt;p id=&quot;HKhN&quot;&gt;&lt;code&gt;Alt + u&lt;/code&gt; – сделать все буквы большими до конца слова&lt;/p&gt;
  &lt;p id=&quot;UrHH&quot;&gt;&lt;code&gt;Alt + l&lt;/code&gt; – сделать все буквы маленькими до конца слова&lt;/p&gt;
  &lt;p id=&quot;7ETX&quot;&gt;&lt;code&gt;Alt + t&lt;/code&gt; – поменять местами текущее слово и предыдущее&lt;/p&gt;
  &lt;p id=&quot;qRZW&quot;&gt;&lt;code&gt;Ctrl + f&lt;/code&gt; – переместиться вперед на один символ&lt;/p&gt;
  &lt;p id=&quot;btT9&quot;&gt;&lt;code&gt;Ctrl + b&lt;/code&gt; – переместиться назад на один символ&lt;/p&gt;
  &lt;p id=&quot;WV9T&quot;&gt;&lt;code&gt;Ctrl + d&lt;/code&gt; – удалить символ под курсором&lt;/p&gt;
  &lt;p id=&quot;WQwO&quot;&gt;&lt;code&gt;Ctrl + h&lt;/code&gt; – удалить символ перед курсором&lt;/p&gt;
  &lt;p id=&quot;I1Ky&quot;&gt;&lt;code&gt;Ctrl + t&lt;/code&gt; – поменять местами символ под курсором и предыдущий.&lt;/p&gt;
  &lt;p id=&quot;ZQJY&quot;&gt;Повторный вызов команд bash&lt;/p&gt;
  &lt;p id=&quot;Q8lO&quot;&gt;&lt;code&gt;Ctrl + r&lt;/code&gt; – искать в истории команд&lt;/p&gt;
  &lt;p id=&quot;R4hG&quot;&gt;&lt;code&gt;Ctrl + g&lt;/code&gt; – выйти из режима поиска команд&lt;/p&gt;
  &lt;p id=&quot;etHE&quot;&gt;&lt;code&gt;Ctrl + p&lt;/code&gt; – перейти к предыдущей команде в истории&lt;/p&gt;
  &lt;p id=&quot;tzxp&quot;&gt;&lt;code&gt;Ctrl + n&lt;/code&gt; – перейти к следующей команде в истории&lt;/p&gt;
  &lt;p id=&quot;XHml&quot;&gt;&lt;code&gt;Alt + .&lt;/code&gt; – использовать последнее слово из предыдущей команды.&lt;/p&gt;
  &lt;p id=&quot;eFYq&quot;&gt;Управление работой команд bash&lt;/p&gt;
  &lt;p id=&quot;MAD6&quot;&gt;&lt;code&gt;Ctrl + l&lt;/code&gt; – очистить экран&lt;/p&gt;
  &lt;p id=&quot;9BId&quot;&gt;&lt;code&gt;Ctrl + s&lt;/code&gt; – остановить вывод на экран (для долго выполняющихся команд с расширенным выводом)&lt;/p&gt;
  &lt;p id=&quot;r78L&quot;&gt;&lt;code&gt;Ctrl + q&lt;/code&gt; – продолжить вывод на экран&lt;/p&gt;
  &lt;p id=&quot;FEV6&quot;&gt;&lt;code&gt;Ctrl + c&lt;/code&gt; – остановить работу команды&lt;/p&gt;
  &lt;p id=&quot;N4pp&quot;&gt;&lt;code&gt;Ctrl + z&lt;/code&gt; – приостановить работу команды.&lt;/p&gt;
  &lt;p id=&quot;xLfQ&quot;&gt;Команды с восклицательным знаком (Bash Bang)&lt;/p&gt;
  &lt;p id=&quot;xUv0&quot;&gt;&lt;code&gt;!!&lt;/code&gt; – выполнить предыдущую команду&lt;/p&gt;
  &lt;p id=&quot;IUyS&quot;&gt;&lt;code&gt;!blah&lt;/code&gt; – выполнить последнюю команду начинающуюся с blah (к примеру, !ls)&lt;/p&gt;
  &lt;p id=&quot;gYQd&quot;&gt;&lt;code&gt;!blah:p&lt;/code&gt; – вывести в консоль текст команды, которую бы выполнила команда !blah(также добавить эту команду в конец истории)&lt;/p&gt;
  &lt;p id=&quot;HtPP&quot;&gt;&lt;code&gt;!$&lt;/code&gt; – последнее слово предыдущей команды (то же самое, что и Alt + .)&lt;/p&gt;
  &lt;p id=&quot;FgmO&quot;&gt;&lt;code&gt;!$:p&lt;/code&gt; – вывести в консоль текст, который бы заменила команда !$&lt;/p&gt;
  &lt;p id=&quot;ni3n&quot;&gt;&lt;code&gt;!*&lt;/code&gt; – предыдущая команда за исключением первого слова (к примеру, если предыдущая команда была vi cd /etc, то !* выполнит cd /etc)&lt;/p&gt;
  &lt;p id=&quot;qDZL&quot;&gt;&lt;code&gt;!*:p&lt;/code&gt; – вывести в консоль текс, который бы заменила команда !*.&lt;/p&gt;
  &lt;p id=&quot;sZlg&quot;&gt;С помощью символов ^^ мы можем выполнить предыдущую команду с заменой части текста на другой. К примеру:&lt;/p&gt;
  &lt;pre id=&quot;iUEk&quot; data-lang=&quot;bash&quot;&gt;ps a
^a^aux
ls aux&lt;/pre&gt;
  &lt;p id=&quot;M23x&quot;&gt;Таким образом содержимое между &amp;quot;крышечками&amp;quot; заменяется на содержимое, которое указано после них.&lt;/p&gt;

</content></entry><entry><id>linuxhowto:_pjJs0jWAsY</id><link rel="alternate" type="text/html" href="https://linuxhowto.ru/_pjJs0jWAsY?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=linuxhowto"></link><title>Замена диска в программном RAID(mdadm)</title><published>2022-10-21T19:25:08.607Z</published><updated>2022-10-21T19:25:08.607Z</updated><summary type="html">В жизни любого администратора Linux систем однажды возникает проблема развалившегося рейда. К счастью, при использовании софтового рейда процедура замена диска не представляет никакой трудности.</summary><content type="html">
  &lt;p id=&quot;lfAo&quot;&gt;В жизни любого администратора Linux систем однажды возникает проблема развалившегося рейда. К счастью, при использовании софтового рейда процедура замена диска не представляет никакой трудности.&lt;/p&gt;
  &lt;p id=&quot;Pbiw&quot;&gt;Итак перед заменой диска проводим первичный анализ ситуации по выводу команды&lt;/p&gt;
  &lt;pre id=&quot;dN5D&quot; data-lang=&quot;bash&quot;&gt;root@ubuntu:~# cat /proc/mdstat&lt;/pre&gt;
  &lt;p id=&quot;8uRJ&quot;&gt;вывод здорового рейда выглядит следующим образом:&lt;/p&gt;
  &lt;pre id=&quot;kSTg&quot; data-lang=&quot;bash&quot;&gt;root@ubuntu:~# cat /proc/mdstat 
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sdc1[1] sdb1[0] 
      5235712 blocks super 1.2 [2/2] [UU] 
      
unused devices: &amp;lt;none&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;M0Rk&quot;&gt;В случае каких либо неполадок с диском вывод будет таким:&lt;/p&gt;
  &lt;p id=&quot;i6YV&quot;&gt;1) В случае если диск полностью выпал из системы&lt;/p&gt;
  &lt;pre id=&quot;LiGh&quot; data-lang=&quot;bash&quot;&gt;Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sdc1[1] 
      5235712 blocks super 1.2 [2/1] [_U]&lt;/pre&gt;
  &lt;p id=&quot;aZbX&quot;&gt;2) В случае если диску плохо, около отвалившихся разделов будет стоять флаг &lt;strong&gt;&lt;code&gt;F&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;We2m&quot; data-lang=&quot;bash&quot;&gt;Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md127 : active raid1 sdc1[1] sdb1(F) 
      5235712 blocks super 1.2 [2/1] [_U]&lt;/pre&gt;
  &lt;p id=&quot;s2oT&quot;&gt;Бывает также ситуации когда на сбойном диске несколько разделов и по выводу &lt;strong&gt;&lt;code&gt;cat /proc/mdstat&lt;/code&gt;&lt;/strong&gt; видно что выпал, например, один. В таком случае, если другие разделы участвуют в построении рейд или куда-либо примонтированы нужно дать на них нагрузку, например, чтения и снова проверить вывод команды. Чаще всего в новом выводе уже все разделы будут отмечены флагом &lt;strong&gt;&lt;code&gt;F&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;NcL4&quot;&gt;Так или иначе в любой из ситуаций нам необходимо принять решение о дальнейшем использовании диска или его замене. В ситуации №1 мы можем попробовать переподключить диск и если системе удастся его определить, провести диагностику.&lt;/p&gt;
  &lt;p id=&quot;kRxJ&quot;&gt;В первую очередь стоит обратить внимание на вывод &lt;code&gt;smartctl -a /dev/&amp;lt;device_name&amp;gt;&lt;/code&gt; и внимательно его изучить. Также можно запустить быстрый тест диска &lt;code&gt;smartctl -t short /dev/&amp;lt;device_name&amp;gt;&lt;/code&gt; и проверить вывод &lt;code&gt;dmesg&lt;/code&gt; на сообщения о плохих блоках. Обычно этих действий хватает чтобы принять решение о дальнейшей судьбе диска.&lt;/p&gt;
  &lt;p id=&quot;gvhK&quot;&gt;После того как решение принято мы готовы чинить рейд. Если в выводе &lt;code&gt;/proc/mdstat&lt;/code&gt; есть разделы отмеченные флагом &lt;strong&gt;&lt;code&gt;F&lt;/code&gt;&lt;/strong&gt;, нам нужно прежде всего их удалить.&lt;/p&gt;
  &lt;pre id=&quot;Lw6y&quot; data-lang=&quot;bash&quot;&gt;mdadm /dev/md127 --remove failed&lt;/pre&gt;
  &lt;p id=&quot;ljE9&quot;&gt;Если на диске несколько разделов и некоторые из них также используются в построении рейд массивов, но было принято решение заменить диск, то такие разделы нужно пометить как сбойные&lt;/p&gt;
  &lt;pre id=&quot;wrfy&quot; data-lang=&quot;bash&quot;&gt;mdadm /dev/md127 -f /dev/sdb2&lt;/pre&gt;
  &lt;p id=&quot;FvZA&quot;&gt;и только после этого произвести их удаление.&lt;/p&gt;
  &lt;p id=&quot;KXIs&quot;&gt;После замены диска создаем на нем нужную нам разметку и производим добавление новых разделов в рейд&lt;/p&gt;
  &lt;pre id=&quot;6bdO&quot; data-lang=&quot;bash&quot;&gt;mdadm /dev/md127 --add /dev/sdb1&lt;/pre&gt;
  &lt;blockquote id=&quot;rE8a&quot;&gt;В случае если было принято решение не менять диск, то достаточно выполнить удаление(remove failed) и также передобавить разделы через опцию &lt;code&gt;--add&lt;/code&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;EumS&quot;&gt;При замене диска(загрузочного) в системном рейд Вам может также потребоваться выполнить установку GRUb после всех процедур&lt;/p&gt;
  &lt;pre id=&quot;kDKi&quot; data-lang=&quot;bash&quot;&gt;grub-install /dev/sdb&lt;/pre&gt;
  &lt;p id=&quot;85MM&quot;&gt;процесс синхронизации рейда мы можем наблюдать через тот же вывод &lt;code&gt;cat /proc/mdstat&lt;/code&gt;&lt;/p&gt;
  &lt;pre id=&quot;nEvv&quot; data-lang=&quot;bash&quot;&gt;root@ubuntu:~# cat /proc/mdstat 
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sdc1[1] sdb1[0]
      5235712 blocks super 1.2 [2/2] [UU]
      [======&amp;gt;..............]  resync = 30.5% (1601792/5235712) finish=0.2min speed=228827K/sec

unused devices: &amp;lt;none&amp;gt;&lt;/pre&gt;
  &lt;p id=&quot;1S6y&quot;&gt;В конце хочется отметить, что восстановление рейда это довольно высоконагруженная процедура. Если Ваш сервер находиться под нагрузкой рекомендуется снизить скорость синронизации, например через sysctl&lt;/p&gt;
  &lt;pre id=&quot;KTnY&quot; data-lang=&quot;bash&quot;&gt;root@ubuntu:~# sysctl -a | grep raid
dev.raid.speed_limit_max = 200000
dev.raid.speed_limit_min = 1000

root@ubuntu:~# sysctl -w dev.raid.speed_limit_max=80000
dev.raid.speed_limit_max = 80000

root@ubuntu:~# sysctl -a | grep raid
dev.raid.speed_limit_max = 80000
dev.raid.speed_limit_min = 1000&lt;/pre&gt;
  &lt;p id=&quot;r82c&quot;&gt;Это снизит просадку производительности и потенциальный выход из строя еще одного диска.&lt;/p&gt;

</content></entry></feed>