1. 序章

この記事では、技術面接でよく聞かれるLinuxとシェルスクリプトに関するいくつかの質問を確認します。 同様に重要なのは、例を通して概念を学び、より明確で鮮明な方法でそれらを理解できるようにすることです。

2. 質問

Q1。 シェルスクリプトを実行する方法は?

まず、 chmod コマンドを使用して、スクリプトmyscript.shに実行権限を付与する必要があります。

chmod +x myscript.sh

次に、現在の作業ディレクトリから開始する絶対パスまたは相対パスを指定して、スクリプトを実行できます。

./myscript.sh

ここで、ドット(。)は現在のディレクトリを示します。

Q2。 .bashrcファイルと.bash_profileファイルの違いは何ですか?

.bashrc.bash_profileはどちらも、シェルコマンドを含むスタートアップファイルです。 さらに、それらはユーザーのホームディレクトリにある隠しファイルです。

Bashは、インタラクティブログインシェルとして呼び出されたときに .bash_profile を読み取って実行しますが、 .bashrc は、Bashがインタラクティブな非ログインシェルとして呼び出されたときに実行されます。

ターミナルでbashコマンドを実行して新しいBashインスタンスを作成すると、それはインタラクティブな非ログインシェルになります。 

.bashrc ファイルには、すべてのカスタムプロンプト設定、エイリアス、および履歴コマンドのカスタマイズを含める必要があります。 一般に、経験則として、 source .bashrc.bash_profileから取得します。

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

これにより、ターミナルで新しい ssh ログインを取得するたびに(インタラクティブ)、.bashrc.bash_profileの両方が実行されます。

Q3。 Bashでのsourceコマンドの使用は何ですか?

sourceコマンドは、引数として渡されるスクリプトまたはファイルに含まれるコマンドを実行し、現在のシェル実行します。

source myscript.sh

スクリプトを実行する従来の方法とは異なることに注意してください。 たとえば、シェルスクリプトを ./ myscript.sh として実行すると、スクリプトを実行するために新しいシェルが起動されます。

source コマンドには、同義語としてドット(。)コマンドもあります。

. .bashrc

このコマンドは、 .bashrc ファイルで設定された関数、変数、およびその他の構成を現在のシェル環境にロードします。

Q4。 export はBashで何をしますか?

export コマンドは、現在のシェルのすべてのサブプロセスで変数を使用できるようにします。

$ var1="Lets Learn Linux"
$ echo $var1
Lets Learn Linux
$ var2="Interview Prep!"
$ export var2
$ bash
$ echo $var1

$ echo $var2
Interview Prep!

この例では、 var2 がエクスポートされたため、現在のシェルのサブシェル内で使用可能でした。 bashコマンドを使用して新しいBashシェルを作成したことに注意してください。 その結果、変数 var1 は新しいシェルに表示されず、空白の出力が観察されました。

Q5。 Linuxファイルのパーミッションとは何ですか?

Linuxのファイルパーミッションは、大きく次のように分類できます。

  1. 読み取り(r) –Linuxユーザーがファイルを読み取るまたはディレクトリを一覧表示する機能。
  2. write(w) –Linuxユーザーがファイルに書き込みしたり、ディレクトリ内に新しいファイルを追加したりする機能。
  3. execute(x) – Linuxユーザーがファイルを実行(実行)したり、ディレクトリ内のファイルを一覧表示したり(ディレクトリでコマンドを実行)する機能。

Linuxのファイルの所有権をさらに次のように分類できます。

  1. ユーザー(u) –通常、ファイルを作成し、ファイルに対する完全なアクセス許可を持っているユーザーです。
  2. グループ(g) – Linuxでグループを作成してから、ユーザーを特定のグループに追加できます。 さらに、特定のグループのすべてのユーザーがファイルを読み取り、変更し、実行できるようにすることができます。
  3. その他(o) –ファイルを作成したユーザー、またはユーザーが属するグループを除く、システム上の他のすべてのユーザーを意味します。 実際には、それは他のすべての人を意味します。

ls を使用してファイルを一覧表示し、そのアクセス許可を確認できます。 最初の列には、ユーザー、グループ、その他の読み取り、書き込み、実行の権限をそれぞれ示す9文字が含まれています

$ ls -lrt out.txt
-rw-r--r-- 1 shubh baeldung 33 Sep 10 21:33 out.txt

ここで、ファイル out.txt の所有者は、読み取りおよび書き込み権限( rw )、およびグループを持っています]およびothersには、 read r )権限のみがあります。

Q6。 ファイルのアクセス許可をどのように変更しますか?

プラス(+)またはマイナス(-)演算子を使用して、chmodコマンドを使用してファイルのアクセス許可を追加または取り消すことができます。 演算子とともに、権限に対応する文字を指定する必要があります: r (読み取り)、 w (書き込み)、および x (実行)。 ファイルにexecute権限を追加して、これを確認しましょう。

$ touch file.txt && ls -lrt file.txt
-rw-r--r-- 1 shubh baeldung 0 Jan 14 13:49 file.txt
$ chmod +x file.txt && ls -lrt file.txt
-rwxr-xr-x 1 shubh baeldung 0 Jan 14 13:49 file.txt

これにより、 user group 、およびothersのすべてに実行権限が付与されます。 ただし、 u (ユーザー)、 g (グループ)、 o (その他)、または a (すべて)。 writeおよびexecute権限をグループに追加しましょう。

$ chmod g+wx out.txt
$ ls -lrt out.txt
-rw-rwxr-- 1 shubh baeldung 33 Sep 10 21:33 out.txt

Linuxでは、readパーミッションのバイナリリファレンスは4です。 また、書き込みおよび実行権限の場合は、それぞれ2および1です。 したがって、ファイルのアクセス許可のすべての組み合わせは、3桁の8進数で表すこともできます。

    番号 権限タイプ            シンボル
       0 無許可              – – –
       1 実行する              – -バツ
       2 書く              -w-
       3 実行+書き込み              -wx
       4 読んだ              r- –
       5 読み取り+実行              処方箋
       6 読み取り+書き込み              rw-
       7 読み取り+書き込み+実行              rwx

したがって、次のように権限を変更することもできます。

$ ls -lrt out.txt
-rw-rwxr-- 1 shubh baeldung 33 Sep 10 21:33 out.txt
$ chmod 715 out.txt && ls -lrt out.txt
-rwx--xr-x 1 shubh baeldung 33 Sep 10 21:33 out.txt

Q7。 スティッキービットとは何ですか?

スティッキービットは高度なファイルパーミッションであり、一般的にパブリックディレクトリ内のファイルを保護するために使用されます。 ディレクトリにスティッキービットを設定した場合、このディレクトリの下にあるファイルは、ファイル/ディレクトリの所有者またはrootユーザーのいずれかのみが削除できます。

典型的な実世界のスティッキービットの例は、 /tmpディレクトリです。

$ ls -ld /tmp
drwxrwxrwt 24 root root 980 Feb  3 21:41 /tmp/

この下位case ‘t’ は、 /tmpディレクトリにスティッキービットが設定されていることを示します。 スティッキービットを使用すると、すべてのユーザーが /tmpの下にファイルを作成できます。ただし、ユーザーが削除できるのは自分が所有するファイルのみです。

Q8。 作成時のファイルのデフォルトのアクセス許可は何ですか?

デフォルトのファイルとディレクトリのアクセス許可は、umask値によって管理されます。 umask コマンドを使用して、値を確認できます。

$ umask
0022

新しいファイルのデフォルトのパーミッションは、パーミッション値666からumask値を引くことで取得できます。 ただし、ディレクトリの場合は、777からumaskの値を引く必要があります。 たとえば、デフォルトのumask002の場合、新しいファイルは 664 権限で作成され、新しいディレクトリは775権限で作成されます。 。

Q9。 スワップスペースとは何ですか?

swap スペースは、パーティションまたはファイルの形式でディスク上にあります。 Linuxはこれを使用して、プロセスで使用可能なメモリを拡張し、使用頻度の低いページをそこに保存します。 通常、オペレーティングシステムのインストール中にスワップスペースを構成します。 ただし、mkswapおよびswaponコマンドを使用して後で設定することもできます。

free コマンドを使用して、使用済みおよび空きのスワップスペースとメモリを確認できます。

$ free
              total        used        free      shared  buff/cache   available
Mem:        8269412     5652220     2387840       17720      229352     2483460
Swap:      15483260      379928    15103332

Q10。 Linuxでiノードのスペース使用率を確認する方法は?

df コマンドを使用して、iノードスペースの使用率を確認できます。

$ df -i

さらに、特定のディスクパーティションを具体的にチェックする場合は、追加の引数を指定できます。

$ df -i /dev 
Filesystem Inodes IUsed IFree IUse% Mounted on 
none 504299 26 504273 1% /dev 

Linuxのiノードスペースはディスクスペースとは異なることに注意する必要があります。

Q11。 シンボリックリンクとは何ですか?

シンボリックリンクまたはソフトリンクは、元のファイルのパスのみを格納し、その内容を格納しないファイルです。 したがって、元のファイルを移動または削除すると、ソフトリンクも壊れます。 これは、WindowsOSでショートカットを作成するのに似ています。

lnコマンドを使用してソフトリンクを作成できます。

$ ln -s out.txt out_link
$ ls -lrt out*
-rwx--xr-t 1 shubh shubh 33 Sep 10 21:33 out.txt
lrwxrwxrwx 1 shubh shubh  7 Dec 25 12:02 out_link -> out.txt

リンクを使用してファイルにアクセスできます。

$ cat out_link
Output will be logged in out.txt

また、ファイルの名前を変更したり、別の場所に移動したり、削除したりすると、リンクが壊れます。

$ mv out.txt out.log
$ ls -lrt out*
-rwx--xr-t 1 shubh shubh 33 Sep 10 21:33 out.log
lrwxrwxrwx 1 shubh shubh  7 Dec 25 12:02 out_link -> out.txt
$ cat out_link
cat: out_link: No such file or directory

Q12。 ハードリンクとは何ですか?

ハードリンクは、元のファイルと同じ基になるiノードを指す別のファイルです。 したがって、同じ物理ファイルの場所を参照します。 ソフトリンクと同様に、lnコマンドを使用してハードリンクを作成することもできます。

$ ln out.log link_to_log
$ ls -lrti *log*
54324670505239531 -rwx--xr-t 2 shubh shubh 33 Sep 10 21:33 out.log
54324670505239531 -rwx--xr-t 2 shubh shubh 33 Sep 10 21:33 link_to_log
$

確認できるように、両方のファイルの iノード番号は同じです(54324670505239531)。ハードリンクを使用してファイルにアクセスすることもできます。

$ cat link_to_log
Output will be logged in out.txt

さらに、元のファイルを削除、名前変更、または削除しても、ハードリンクを使用してそのコンテンツにアクセスできます。

$ mv out.log out.txt
$ cat link_to_log
Output will be logged in out.txt

Q13。 ファイルのフルパスとその名前を一覧表示するにはどうすればよいですか?

特別な変数PWDlsコマンドと一緒に使用して、フルパスを取得できます。

$ ls -lrt  "$PWD"/out*
-rwx--xr-t 2 shubh shubh 33 Sep 10 21:33 /home/shubh/out.txt
lrwxrwxrwx 1 shubh shubh  7 Dec 25 12:02 /home/shubh/out_link -> out.txt

別のアプローチは、readlinkコマンドを使用することです。

$ readlink -f out.txt
/home/shubh/out.txt

Q14。 シェルスクリプト内でログを作成するにはどうすればよいですか?

execコマンドを使用して、stdout(FD 1)をログファイルにリダイレクトできます。

#! /bin/bash
script_log="/tmp/log_`date +%F`.log"
exec 1>>$script_log
echo "This will be written into log file rather than terminal.."
echo "This too.."

次に、標準エラーを同じファイルに書き込む方法を確認しましょう。

#! /bin/bash
script_log="/home/shubh/log_`date +%F`.log"
exec 1>>$script_log
exec 2>&1
datee
echo "Error for the typo in date command will be logged in the log file"
date
echo "Output of correct date command will also be logged in log file, including this echo statement"

ここでは、 stderr (2)を stdout (1)にコピーしましたが、stdoutはすでにログファイルに書き込むように変更されています。

Q15。 Bashでstdoutstderrをどのように抑制できますか?

stdoutおよびstderrnullデバイスにリダイレクトすることにより、Linuxコマンドまたはスクリプトによってスローされる出力またはエラーを抑制することができます。

$ date
Fri Dec 25 13:20:19 IST 2020
$ date > /dev/null
$

ここでは、stdout/dev /nullにリダイレクトすることで抑制しました。  stdoutstderrの両方をリダイレクトするには、 stderrをstdoutにリダイレクトしてから、stdoutを/ dev /nullにリダイレクトする必要があります。

$ cat out.log
cat: out.log: No such file or directory
$ cat out.log > /dev/null 2>&1
$

2>&1 リダイレクトするための省略形です stderr stdout

Q16。 キーワード「ERROR」とその周囲の行を含むファイルから行を表示するにはどうすればよいですか?

grep コマンドを使用して、ファイル内のパターンを照合し、それを表示できます。

$ grep ERROR subtitles.txt
Dialogue: 0,1:11:43.23,1:xx [ERROR: failed to parse ],Default,,0,0,0,,the dawn is coming.

次に、一致するパターンの両側の周囲の線を取得するには、grepコマンドのCオプションを使用できます。

$ grep -C1 ERROR subtitles.txt
Dialogue: 0,1:11:40.35,1:11:42.43,Default,,0,0,0,,And I promise you...
Dialogue: 0,1:11:43.23,1:xx [ERROR: failed to parse ],Default,,0,0,0,,the dawn is coming.
Dialogue: 0,1:11:44.82,1:11:49.37,Default,,0,0,0,,One day, the Batman will have to answer for the laws he's broken.

grepコマンドのCNオプションは、パターンに一致する行の前後のN行も出力します。

Q17。 実行中のプロセスのリストを確認するにはどうすればよいですか?

topコマンドを使用してプロセスを一覧表示できます。 インタラクティブでリアルタイムのインターフェースを提供します。

$ top
top - 13:56:25 up 5 days, 23:37,  0 users,  load average: 0.52, 0.58, 0.59
Tasks:   4 total,   1 running,   3 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  1.1 sy,  0.0 ni, 97.5 id,  0.0 wa,  0.4 hi,  0.0 si,  0.0 st
KiB Mem :  8269412 total,  2187168 free,  5852892 used,   229352 buff/cache
KiB Swap: 15483260 total, 15078760 free,   404500 used.  2282788 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0    8936    192    148 S   0.0  0.0   0:00.23 init
   76 root      20   0    8936    224    180 S   0.0  0.0   0:00.00 init
   77 shubh     20   0   16916   3612   3500 S   0.0  0.0   0:01.21 bash
  354 shubh     20   0   17624   2008   1436 R   0.0  0.0   0:00.01 top

確認できるように、 topコマンドは、最初の数行にさまざまなシステムリソースの要約も一覧表示します。 同様に、プロセスを一覧表示する別の方法は、psコマンドを使用することです。

$ ps -aef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 Dec19 ?        00:00:00 /init
root        76     1  0 Dec23 tty2     00:00:00 /init
shubh       77    76  0 Dec23 tty2     00:00:01 /bin/bash --login
shubh      355    77  0 14:03 tty2     00:00:00 ps -aef

Q18。 ゾンビプロセスとは何ですか?

プロセスがジョブを完了すると、その親はSIGCHLDシグナルによって通知されます。 次に、親は wait()システムコールを実行して子プロセスのステータスを読み取り、そのexitコードを読み取ります。 これにより、プロセステーブルから子プロセスのエントリもクリーンアップされるため、プロセスが終了します。

ただし、親プロセスが子プロセスの作成時にwait()システム呼び出しを実行するようにプログラムされていない場合、適切なクリーンアップは行われません。 その結果、親プロセスは子プロセスの状態変化を監視できません。 これにより、終了したプロセスのゾンビ状態がプロセステーブルに残り、プロセスリストにゾンビプロセスとして表示されます。

Linuxのゾンビプロセスは、無効またはデッドプロセスとも呼ばれます。 ゾンビプロセスは、親プロセスが強制終了されるか、実行が終了するとクリーンアップされます。

Q19。 拡張子が「.java」で、文字列「extends」が含まれるファイルを検索するコマンドを記述します。

find コマンドを使用して、「app」ディレクトリ内の「extends」という単語を含むすべての.javaファイルを検索できます。

find app -name "*.java" -type f -exec grep -l extends {} \;

ここでは、オプション-type f を指定して、通常のファイルのみを検索します。 その後、 -exec オプションを使用して、findコマンドによって返されたファイルのリストに対してgrepコマンドを実行しました。 最後のセミコロンにより、 {}が現在のファイル名。 セミコロンがシェルによって解釈されないようにするには、バックスラッシュが必要であることに注意してください。

Q20。 ディレクトリが占めるスペースをどのように計算できますか?

du コマンドを使用して、ディレクトリが占めるスペースを取得できます。

$ du -sh Codes
9.4M    Codes

さらに、ディレクトリ内のディスクスペース追跡するには、lsコマンドのSオプションを使用して、スペース順にファイルを一覧表示できます。

$ ls -lrSh | tail -2
-rwxrwxrwx 1 shubh shubh 225K Jul 17  2018 pagerank.zip
-rwxrwxrwx 1 shubh shubh 6.4M Dec 13  2016 mbox.txt

上に示したように、このコマンドはディレクトリ内の2つの最大のファイルを一覧表示します。

Q21。 grepコマンドを使用せずにファイル内のパターンを見つけるにはどうすればよいですか?

まず、sedコマンドを使用してソリューションを確認しましょう。

$ sed -n '/ERROR/ p' subtitles.txt
Dialogue: 0,1:11:43.23,1:xx [ERROR: failed to parse ],Default,,0,0,0,,the dawn is coming.

ここでは、パターン ERROR とprint( p )関数を指定しました。 また、 -n フラグを指定して、sedによるバッファーの印刷を抑制しました。 awk コマンドを使用して、パターンを含む行を印刷することもできます。

$ awk '/ERROR/' subtitles.txt
Dialogue: 0,1:11:43.23,1:xx [ERROR: failed to parse ],Default,,0,0,0,,the dawn is coming.

Q22。 ファイル内のパターンを検索して置き換えるにはどうすればよいですか?

sed コマンドを使用して、subtitles.txtファイルのパターン「ERROR」を「WARN」に置き換えてみましょう。

$ sed -i 's/ERROR/WARN/g' subtitles.txt
$ grep "WARN" subtitles.txt
Dialogue: 0,1:11:43.23,1:xx [WARN: failed to parse ],Default,,0,0,0,,the dawn is coming.

ここでは、 g (グローバル)フラグを使用して、ファイル内で出現するすべてのパターンを置き換えました。 さらに、 -i オプションは、sedに入力ファイルをインプレースで編集するように指示します。

Q23。 ファイルのN行目だけを印刷するにはどうすればよいですか?

sed コマンドを使用して、profileファイルの8番目行を印刷してみましょう。

$ sed -n '8p' /etc/profile
    if [ -f /etc/bash.bashrc ]; then

ここでは、print関数とsedコマンドの-nフラグを使用しました。 または、awkコマンドを使用することもできます。

$ awk '8 == NR' /etc/profile
    if [ -f /etc/bash.bashrc ]; then

このスニペットでは、awk組み込み変数NRを使用しました。これは、awkコマンドによってこれまでに読み取られたレコードの総数を保持します。

Q24。 シェルスクリプトのシバンとは何ですか?

shebang (“#!”)は、スクリプトの解釈方法をシステムに指示します。 実際、Linuxのすべてのスクリプトは、スクリプトファイルの最初の行で指定されたインタープリターを使用して実行されます。

#!/bin/bash

ほとんどすべてのbashスクリプトはこの行で始まります(bash実行可能ファイルが/bin パスにあると想定しています)。 さらに、これにより、別のシェルでスクリプトを実行している場合でも、Bashシェルが常にインタープリターとして機能するようになります。

Q25。 Bashスクリプトをデバッグする方法は?

シェルスクリプトをデバッグする最も効果的な方法の1つは、コマンドに verbose(-v)および xtrace(-x)モードスイッチを追加することです-スクリプトの実行中の行:

bash -xv ./myscript.sh

冗長モードでは、評価前に各コマンドを表示できます。 対照的に、 xtrace モードは、展開後、実行前に各行のコマンドのトレースを出力します。 したがって、 -xオプションと-vオプションの両方を組み合わせて、変数置換の前後のステートメントがどのように見えるかを確認できます。 もう1つの同等の機能は、setコマンドを使用してスクリプト内のモードを有効にすることです。

Q26。 CSVファイルのN番目の列にすべての値を追加するにはどうすればよいですか?

サンプルのCSVファイルを考えてみましょう。

$ cat addme.csv
1,10,6
2,20,5
3,70,5

awk ツールを使用して、このファイルの2番目の列に値を追加します。

$ awk -F "," '{Total=Total+$2} END{print "Total is: " Total}' addme.csv
Total is: 100

この例では、入力ファイルaddme.csvのすべてのレコードのコンマで区切られた列をフェッチしました。 さらに、2番目の列の値をTotal変数に追加し続けました。 次に、すべてのレコードを処理した後、ENDブロックを使用して合計を印刷しました。

3. 結論

この記事では、技術面接中に直面する可能性のあるいくつかの質問について説明しました。 これは決して網羅的なリストではなく、さらなる研究の始まりとしてのみ考慮されるべきです。

Baeldungでは、今後のインタビューで成功することを願っています。 これらの質問があなたの夢の仕事に着手するのに役立つことを願っています。