26 Ağustos 2020 Çarşamba

stty komutu - Seri Port İletişimi İçindir

Giriş
Bu komut tty komutu ile ilgili. seri port'a bağlı cihazlar (örneğin modem) için kullanılır. Bu komutun
Special characters
Special settings
Control settings
Input settings
Output settings
Local settings
Combination settings
başlıkları altında milyon tane seçeneği daha var.

-F seçeneği
Kullanılacak device belirtilir.

Örnek
Şöyle yaparız.
stty -F /dev/ttyS0 115200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon
-iexten -echo -echoe -echok -echoctl -echoke
1. Special characters
Örnek ver

2.  Special settings:
Örnek ver

3. Control settings
Örnek ver

4. Input settings
Örnek ver

5. Output settings

onlcr seçeneği - new line conversion
Eğer su seçenek varsa \r karakteri \n\r haline getirilir.
Örnek
new line conversion özelliğini kapatmak için şöyle yaparız
stty -onlcr;
Örnek
new line conversion özelliğini kapatmak için şöyle yaparız. Böylece \A yani decimal 10 gönderdiğimizde \D decimal 13 karakterini de eklemez. \n karaterinin artık \r\n olarak algılanmasını engeller.
stty -F /dev/ttyS2 -onlcr
opost seçeneği
Açıklaması şöyle
You can disable all output processing including ocrnl with stty -opost, but that leaves all the input processing for data transmitted in the other direction.

6. Local settings
echo seçeneği
Açıklaması şöyle
In order for the terminal not to show typed text, echo needs to be turned off. The command stty -echo does this. To return to normal, run stty echo.
Örnek
Şöyle yaparız.
sha1pass "$( stty -echo; head -n 1; stty echo )"
Örnek
Şöyle yaparız
#!/bin/sh
printf "Enter password: "
stty -echo
read -r password
stty echo
echo ""
echo "password=$password"
Örnek
Yazılan karakterleri göstermek için şöyle yaparız.
stty echo
7. Combination settings

raw seçeneği
\n karaterinin artık \r\n olarak algılanmasını engeller. Açıklaması şöyle
One of the stty settings (onlcr) tells the terminal driver to convert newline (which is actually ASCII line-feed) to carriage-return plus line-feed.

Unix-like systems just write a newline to end lines, letting the terminal driver do the right thing.
Şöyle yaparız.
stty raw -echo < /dev/ttyS2
sane seçeneği
Şöyle yaparız.
stty sane

25 Ağustos 2020 Salı

source komutu

Giriş
source komutu tek bir dosya alır. Kullanımı şöyledir.
source filename [arguments]
source komutunun iki tane temel amacı var
1. Bir başka bash betiğindeki metodları kendi içime almam veya çalıştırmam
2. Bir başka dosyada tanımlı properties değerlerini kendi içime almam

Çalıştırma
Açıklaması şöyle. Yeni bir kabuk (shell) açmadan dosyadaki satırları çalıştırır.
source: source filename [arguments]

Execute commands from a file in the current shell.

Read and execute commands from FILENAME in the current shell.  The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.

Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
Source işlemi için sadece read hakkı yeterlidir, execute hakkına gerek yoktur.

1. Source Komutu Alternatifi
"source + filename" yazmak yerine ". filename" şeklinde de yapılabilir.

Örnek
Normalde bir dosyayı çalıştırmak için şöyle yaparız
$ ./hello.sh
Source içinse şöyle yaparız
$ . hello.sh
Açıklaması şöyle
for t.sh the shell will search the PATH in order for a file named t.sh and execute it if it finds it

for . t.sh the shell will search the PATH in order for a file named t.sh but source it if it finds it.

2. Kullanım
Örnek - Properties
Elimizde şöyle bir my.properties dosyası olsun
REMOTE_IP1=10.44.165.236:1535
REMOTE_IP2=10.44.165.237:1535
Kendi dosyamda şöyle yaparız. Böylece artık değişkenlere $REMOTE_IP1 şeklinde erişebilirim
. my.properties
Örnek - Metod
Elimizde şöyle bir dizin yapısı olsun.
- main.sh
- lib/
  - clean.sh
  - get.sh
  - index.sh
  - test.sh
main.sh içinden alt dizindeki diğer sh dosyalarında tanımlı metodları çağırmak için şöyle yaparız.
source lib/get.sh
source lib/clean.sh
source lib/index.sh
source lib/test.sh
Daha sonra bu metodları çağırmak için main.sh'ta şöyle yaparız.
get_products
clean_products
make_index
test_index

alias tanımlama - ~/.bash_aliases Dosyası Kullanılabilir

Giriş
alias built-in komutu ile alias tanımlama farklı şeyler.

Alias Hataları
- Alias isminde boşluk olmamalıdır
Örnek
Şu alias hata verir. Çünkü alias isminde boşluk var
$ alias 'apt update'='sudo apt update -y'
bash: alias: 'apt update': invalid alias name
Şöyle yaparız
alias apt-update='sudo apt update -y'
Alias Tanımlandığı Aynı Satırda Kullanılamaz
Örnek
Şu alias tanımlaması çalışmaz
$ alias x=ls; x
x: command not found
Şöyle yaparız
You can work around it by forcing a re-parsing using eval:

$ alias x=date; eval x
Fri Nov 12 18:20:54 JST 2021

- Alias Tanımlamada Sonsuz Döngü Varsa
Bash buna izin vermiyor. Açıklaması şöyle.
Bash does allow aliases to contain aliases but it has built-in protections against infinite loops.
Eğer bash alias'larda döngü bulursa "command not found" şeklinde hata verir.
Örnek
Elimizde şöyle bir alias dizisi olsun
alias ls="lsc"
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'
Komut satırına lsc yazarsak elimizde şu geçer.
ls -Flatr --color=always
ls bir alias olduğu için elimizde şu geçer.
lsc -Flatr --color=always
lsc de bir alias olduğu için ve daha önce açıldığı için bash hata verir. Çıktı olarak şunu alırız
$ lsc
lsc: command not found
Alias İçinde Tek Tırnak Varsa
alias'ı çift tırnak içine alırız. Bu sadece basit çözümlerden birisi
Örnek
Şöyle yaparız
$ alias ios="iostat -xk 2 $(findmnt -T ~ | awk 'END {print $2}')"
Alias Hangi Dosyalarda Tanımlanır
~/.bashrc veya ~/.bash_aliases dosyasına tanımlanır.

1. ~/.profile Dosyası - Kullanmayın
Bu dosya alias tanımlamak için uygun değil. Açıklaması şöyle. Bu dosya login shell içindir.
The commands in ~/.profile are run by login shells. That file is a good place to do things that should be done once at the beginning of each session but not repeated every time a new shell is started. ~/.profile is good for setting environment variables, which will be inherited by all descendant processes.
Ancak bash kabukları login shell değildir. Açıklaması şöyle.
Aliases are not inherited, and the shell you get in a terminal window in Ubuntu is not (by default) a login shell. To define aliases for all your interactive Bash shells, the definitions need to be somewhere where they'll be run each time you start such a shell.
2. ~/.bashrc Dosyası
~/.bashrc Dosyası yazısına taşıdım

3. ~/.bash_aliases Dosyası
Bu dosya ~/.bashrc dosyası tarafından okunur. Açıklaması şöyle.
The default ~/.bashrc in Ubuntu checks if ~/.bash_aliases exists and sources it.
Alias ve expansion
alias expansion'a tabi tutulduğu için eğer alias yapılan komut parametreyi en sona almıyorsa sorun çıkıyor. Bu durumda alias yerine function tanımlamak daha iyi.

Örnek
Alias yerine function için şöyle yaparız. Önce ~/.bashrc dosyasında şöyle bir metod tanımlayalım. $@ tüm parametreler anlamına gelir. bash kodlama - gömülü değişkenler yazısına bakabilirsiniz.
myrm() {
 /bin/mv "$@" /home/user/Trash/
}
Çağırmak için şöyle yaparız.
myrm foo 
Bu şöyle yorumlanır.
mv foo /home/user/Trash
sudo ve Alias
alias ile tanımladığımız kısa komutu sudo komutuna geçmek istersek sudo için de alias yapmak gerekir. Açıklaması şöyle
If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.
En sonda bir boşluk bırakarak şöyle yaparız
alias sudo="sudo "
Daha sonra bir alias tanımlarız.
alias myalias="..."
sudo ile çalıştırmak için şöyle yaparız.
sudo myalias param1:param2
Alias ve dosyalar
Örnek
Elimizde şöyle bir kod olsun.
alias thead='head | cut -d, -f1- | column -s, -t'
Bunu çağıralım
thead file.csv
Aslında şu çıktıyı elde ederiz ve hata alırız.
head | cut -d, -f1- | column -s, -t file.csv
Dosyayı < işaret ile geçmek gerekir. Şöyle yaparız.
thead <file.csv
Kullanım Örnekleri

Örnek
bash'te alias tanımlarken aliasismi='...' şeklide tanımlarız. Diğer bazı kabuklarda alias isminden sonra = karakteri gerekmeyebilir.

Örnek
Şöyle yaparız. Komut tek tırnak içine alınır.
alias myalias='...'
Örnek
Şöyle yaparız. Komut tek tırnak içine alınır.
alias open='/usr/lib/node_modules/occam-open-cli/open.js'
Örnek
Çok satırlı alias tanımla için şöyle yaparız
#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'
Çıktı olarak şunu alırız.
$ jo
please enter values 
foo bar
baz
My values are foo bar and baz